Respuestas:
Para obtener todo el contenido de un archivo:
$content = [IO.File]::ReadAllText(".\test.txt")
Número de líneas:
([IO.File]::ReadAllLines(".\test.txt")).length
o
(gc .\test.ps1).length
Una especie de truco para incluir una línea vacía al final:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
\r\n
contará cualquier línea con .
Invoke-WebRequest
?
En una nota al margen, en PowerShell 3.0 puede usar el Get-Content
cmdlet con el nuevo modificador Raw:
$text = Get-Content .\file.txt -Raw
Get-Content
hizo, pero no fue hasta la 3.0 que lo consiguió -Raw
. Sin eso, se almacena como una matriz de líneas.
-Raw
parámetro no está implementado por nada nativo.
(ver explicación detallada aquí)
$text = Get-Content $filePath | Out-String
El IO.File.ReadAllText
no funcionó para mí con una ruta relativa, se busca el archivo en %USERPROFILE%\$filePath
lugar del directorio actual (cuando se ejecuta desde PowerShell ISE al menos):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
Un enfoque más para leer un archivo que me gusta se conoce de diversas maneras como notación variable o sintaxis variable e implica simplemente encerrar una especificación de archivo entre llaves precedidas por un signo de dólar, a saber:
$content = ${C:file.txt}
Esta notación se puede utilizar como valor L o valor R ; por lo tanto, podría escribir fácilmente en un archivo con algo como esto:
${D:\path\to\file.txt} = $content
Otro uso útil es que puede modificar un archivo en su lugar sin un archivo temporal y sin subexpresiones, por ejemplo:
${C:file.txt} = ${C:file.txt} | select -skip 1
¡Al principio me fascinó esta notación porque era muy difícil averiguar algo sobre ella! Incluso la especificación PowerShell 2.0 lo menciona solo una vez y muestra solo una línea usándolo, pero sin explicación ni detalles de uso. Posteriormente, encontré esta entrada de blog sobre variables de PowerShell que brinda algunas buenas perspectivas.
Una nota final sobre el uso de esto: debe usar una designación de unidad, es decir, ${drive:filespec}
como he hecho en todos los ejemplos anteriores. Sin la unidad (por ejemplo ${file.txt}
) no funciona. No hay restricciones en la especificación del archivo en esa unidad: puede ser absoluta o relativa.
Get-Content toma datos y los vuelca en una matriz, línea por línea. Suponiendo que no haya otros requisitos especiales que los que enumeró, ¿podría guardar su contenido en una variable?
$file = Get-Content c:\file\whatever.txt
Ejecutar solo $file
devolverá el contenido completo. Entonces puede hacer $file.Count
(porque las matrices ya tienen un método de recuento incorporado) para obtener el número total de líneas.
¡Espero que esto ayude! No soy un genio de las secuencias de comandos, pero esto me pareció más fácil que muchas de las cosas anteriores.
$content = [IO.File]::ReadAllText(".\test.txt")
parece hacer lo mismo que$content = (gc ".\test.txt" | out-string)
. Como el segundo de los dos es más corto, eso es lo que prefiero. Desafortunadamente, ninguno de los métodos que proporcionó para calcular el número total de líneas tiene en cuenta las líneas en blanco finales. ¿Alguna otra idea?