Risposte:
Per ottenere l'intero contenuto di un file:
$content = [IO.File]::ReadAllText(".\test.txt")
Numero di linee:
([IO.File]::ReadAllLines(".\test.txt")).length
o
(gc .\test.ps1).length
Una sorta di hackish per includere una riga vuota finale:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
\r\n
verrà conteggiata qualsiasi riga con .
Invoke-WebRequest
?
In una nota a margine, in PowerShell 3.0 è possibile utilizzare il Get-Content
cmdlet con la nuova opzione Raw:
$text = Get-Content .\file.txt -Raw
Get-Content
fatto, ma è stato solo 3.0 che ha ottenuto -Raw
. Senza questo, viene memorizzato come un array di linee.
-Raw
parametro non è implementato da nulla di nativo.
(vedi spiegazione dettagliata qui)
$text = Get-Content $filePath | Out-String
Il IO.File.ReadAllText
non ha funzionato per me con un percorso relativo, si cerca il file nella %USERPROFILE%\$filePath
anziché la directory corrente (durante l'esecuzione di PowerShell ISE almeno):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
Un altro approccio alla lettura di un file che mi piace è indicato in vari modi come notazione variabile o sintassi variabile e implica semplicemente racchiudere un filespec tra parentesi graffe precedute da un segno di dollaro, vale a dire:
$content = ${C:file.txt}
Questa notazione può essere usata sia come valore L che come valore R ; quindi, potresti scrivere altrettanto facilmente su un file con qualcosa del genere:
${D:\path\to\file.txt} = $content
Un altro utile utilizzo è che puoi modificare un file in posizione senza un file temporaneo e senza sottoespressioni, ad esempio:
${C:file.txt} = ${C:file.txt} | select -skip 1
Inizialmente sono rimasto affascinato da questa notazione perché era molto difficile scoprire qualcosa al riguardo! Anche la specifica PowerShell 2.0 lo menziona solo una volta mostrando solo una riga che lo utilizza, ma senza alcuna spiegazione o dettagli sull'utilizzo. Successivamente ho trovato questa voce di blog sulle variabili di PowerShell che fornisce alcuni buoni approfondimenti.
Un'ultima nota sull'utilizzo di questo: è necessario utilizzare una designazione di unità, cioè ${drive:filespec}
come ho fatto in tutti gli esempi precedenti. Senza l'unità (ad esempio ${file.txt}
) non funziona. Nessuna restrizione sul filespec su quell'unità: può essere assoluto o relativo.
Get-Content acquisisce i dati e li scarica in un array, riga per riga. Supponendo che non ci siano altri requisiti speciali rispetto a quelli elencati, potresti semplicemente salvare i tuoi contenuti in una variabile?
$file = Get-Content c:\file\whatever.txt
L'esecuzione $file
restituirà solo l'intero contenuto. Quindi puoi semplicemente fare $file.Count
(perché gli array hanno già un metodo di conteggio integrato) per ottenere il numero totale di righe.
Spero che questo ti aiuti! Non sono un mago dello scripting, ma questo mi è sembrato più facile di molte cose sopra.
$content = [IO.File]::ReadAllText(".\test.txt")
sembra fare la stessa cosa di$content = (gc ".\test.txt" | out-string)
. Dato che il secondo dei due è più corto, è quello che preferisco. Sfortunatamente, nessuno dei metodi forniti per calcolare il numero totale di righe prende in considerazione le righe vuote finali. Altre idee?