Estoy leyendo una lista de usuarios desde un archivo, cambiando su contraseña y luego escribiendo 2 archivos, uno con éxitos y otro con fallas.

Quiero automatizar este proceso. Pensé en hacer una comparación una vez que el script esté terminado, pero sería más limpio simplemente eliminar a los usuarios de la lista cuando el cambio sea exitoso. ¿Hay algo que funcione como lo opuesto a -Append para la función de archivo de salida? Me gustaría editar el archivo en lugar de reescribirlo todo cada vez.

1
Squirreljester 28 ago. 2020 a las 18:47

1 respuesta

La mejor respuesta

Como se mencionó en los comentarios, "eliminar una línea" de un archivo no es tan trivial como la mayoría de los editores de texto gráfico lo hacen parecer.

El contenido lógico del archivo de texto en el disco es solo una cadena continua de valores de bytes. Los procesadores de texto pueden optimizar la E / S del disco al realizar un seguimiento de la modificación de desplazamiento más bajo (es decir, las modificaciones realizadas más cerca de la esquina superior izquierda del editor) y luego solo escribir la parte restante del texto en disco desde el desplazamiento correspondiente en el archivo, pero no puede simplemente "eliminar una línea" en el medio del archivo como una operación del sistema de archivos, eso dejaría un gran espacio en los datos del archivo.

Suponiendo que el número máximo de usuarios en cuestión se cuenta en cientos o unos pocos miles, no tiene que preocuparse por el rendimiento del disco, simplemente elimine las líneas relevantes en la memoria en PowerShell y sobrescriba el archivo original con la lista restante:

$allUsers = Get-Content .\full_list.txt
$alreadyProcessed = Get-Content .\success.txt

$remainingUsers = $allUsers | Where-Object { $alreadyProcessed -notcontains $_ }

$remainingUsers |Set-Content .\full_list.txt
2
Mathias R. Jessen 28 ago. 2020 a las 16:54