Come leggere i file riga per riga in Windows PowerShell
-
Leggi il file riga per riga in PowerShell utilizzando
Get-Contentcon un cicloForEach -
Leggi il file riga per riga in PowerShell utilizzando
Get-ContentconForeach-Object -
Utilizzare la classe
[System.IO.File]in PowerShell per leggere il file riga per riga -
Utilizzare la classe
System.IO.StreamReaderin PowerShell per leggere il file riga per riga - Conclusione
In Windows PowerShell, possiamo utilizzare il cmdlet Get-Content per leggere i file. Tuttavia, il cmdlet caricherà il contenuto dell’intero file in memoria tutto in una volta, il che fallirà o si bloccherà con file di grandi dimensioni.
Per risolvere questo problema, possiamo leggere i file riga per riga, e questo articolo ti mostrerà come fare.
Prima di iniziare, è meglio se creiamo un file di testo di esempio con più righe. Ad esempio, ho creato un file.txt contenente le seguenti righe.
file.txt:
one
two
three
four
five
six
seven
eight
nine
ten
Secondo Microsoft, un’espressione regolare è un modello utilizzato per abbinare il testo. Può essere composto da caratteri letterali, operatori e altre costruzioni. Questo articolo proverà diversi script che coinvolgono una variabile standard chiamata Espressioni Regolari, denotata da $regex.
Leggi il file riga per riga in PowerShell utilizzando Get-Content con un ciclo ForEach
Abbiamo discusso inizialmente che il cmdlet Get-Content presenta delle lacune quando carichiamo un file di grandi dimensioni, poiché caricherà i contenuti del file in memoria tutto in una volta. Tuttavia, possiamo migliorarlo caricando le righe una alla volta utilizzando il ciclo foreach.
Codice di esempio:
foreach ($line in Get-Content .\file.txt) {
if ($line -match $regex) {
Write-Output $line
}
}
Ecco una spiegazione passo-passo del processo:
-
Ottieni il contenuto del file:
Iniziamo utilizzando il cmdlet
Get-Contentper leggere i contenuti del file.Get-Content .\file.txtSostituisci
"file.txt"con il percorso del tuo file. -
Itera su ogni riga:
Successivamente, utilizziamo un ciclo
ForEachper iterare su ogni riga nel file. Il ciclo assegna ogni riga a una variabile,$line, una alla volta.All’interno del ciclo, puoi sostituire
Write-Host $linecon il codice che elabora ogni riga in base alle tue esigenze. In questo esempio, stiamo semplicemente visualizzando ogni riga utilizzandoWrite-Host, ma puoi eseguire qualsiasi azione desiderata.
Leggi il file riga per riga in PowerShell utilizzando Get-Content con Foreach-Object
Per leggere un file riga per riga in PowerShell utilizzando Get-Content con Foreach-Object, segui questi passaggi:
-
Usa il cmdlet
Get-Content:Iniziamo utilizzando il cmdlet
Get-Contentper leggere i contenuti del file. Il cmdletGet-Contentlegge ogni riga del file e le restituisce come oggetti in un pipeline.powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object { # Process each line here $_ # $_ represents the current line }
Sostituisci "example.txt" con il percorso del tuo file.
-
Ciclo Foreach-Object:
Successivamente, utilizziamo il cmdlet
Foreach-Object(%è un alias perForeach-Object) per iterare su ogni riga nella pipeline. All’interno del blocco di script (il codice all’interno di{}), puoi elaborare ogni riga utilizzando$_, che rappresenta la riga corrente in fase di elaborazione.powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object { # Process each line here $_ # $_ represents the current line }All’interno di questo ciclo, puoi eseguire qualsiasi azione necessaria su ciascuna riga.
Esempio completo di codice funzionante
Ecco un esempio completo di codice funzionante che legge un file riga per riga e visualizza ogni riga:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
# Read the file line by line and process each line
Get-Content -Path $filePath | ForEach-Object {
# Process each line here
Write-Host $_
}
} else {
Write-Host "File not found: $filePath"
}
In questo codice:
- Specifichiamo il percorso del file utilizzando la variabile
$filePath. - Utilizziamo il cmdlet
Test-Pathper verificare se il file esiste. - Se il file esiste, utilizziamo
Get-Contentper leggere il suo contenuto e passarli aForeach-Objectper l’elaborazione. - All’interno del blocco di script
Foreach-Object, utilizziamoWrite-Host $_per visualizzare ogni riga.
Utilizzare la classe [System.IO.File] in PowerShell per leggere il file riga per riga
Per leggere un file riga per riga in PowerShell utilizzando la classe [System.IO.File], segui questi passaggi:
-
Specifica il percorso del file:
Inizia specificando il percorso del file che desideri leggere. Sostituisci
"example.txt"con il percorso effettivo del tuo file.powershellCopy code $filePath = "example.txt" -
Controlla se il file esiste:
Prima di tentare di leggere il file, è buona pratica controllare se il file esiste utilizzando il cmdlet
Test-Path:powershellCopy codeif (Test-Path $filePath) { # File exists, proceed with reading } else { Write-Host "File not found: $filePath" }
-
Leggi il file riga per riga:
Una volta verificato che il file esiste, puoi utilizzare la classe
[System.IO.File]per leggere il file riga per riga. Ecco il codice per farlo:powershellCopy codetry { $lines = [System.IO.File]::ReadLines($filePath) foreach ($line in $lines) { # Process each line here Write-Host $line } } catch { Write-Host "Error reading the file: $_" }In questo codice:
- Utilizziamo il metodo
ReadLinesdella classe[System.IO.File]per leggere il file riga per riga e memorizziamo le righe nella variabile$lines. - Quindi utilizziamo un ciclo
foreachper iterare su ogni riga in$linese processarla. In questo esempio, stiamo semplicemente visualizzando ogni riga utilizzandoWrite-Host, ma puoi eseguire qualsiasi azione desiderata.
- Utilizziamo il metodo
Esempio completo di codice funzionante
Ecco un esempio completo di codice funzionante che legge un file riga per riga e visualizza ogni riga:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
try {
# Read the file line by line
$lines = [System.IO.File]::ReadLines($filePath)
foreach ($line in $lines) {
# Process each line here
Write-Host $line
}
} catch {
Write-Host "Error reading the file: $_"
}
} else {
Write-Host "File not found: $filePath"
}
In questo codice:
- Specifichiamo il percorso del file utilizzando la variabile
$filePath. - Verifichiamo se il file esiste utilizzando
Test-Path. - Se il file esiste, utilizziamo il metodo
[System.IO.File]::ReadLines()per leggere il file riga per riga e processare ogni riga utilizzando un cicloforeach. - Includiamo la gestione degli errori per catturare eventuali eccezioni che potrebbero verificarsi durante la lettura del file.
Utilizzare la classe System.IO.StreamReader in PowerShell per leggere il file riga per riga
Per leggere un file riga per riga in PowerShell utilizzando la classe System.IO.StreamReader, segui questi passaggi:
-
Specifica il percorso del file:
Inizia specificando il percorso del file che desideri leggere. Sostituisci
"example.txt"con il percorso effettivo del tuo file.powershellCopy code $filePath = "example.txt" -
Controlla se il file esiste:
Prima di tentare di leggere il file, è buona pratica controllare se il file esiste utilizzando il cmdlet
Test-Path:powershellCopy codeif (Test-Path $filePath) { # File exists, proceed with reading } else { Write-Host "File not found: $filePath" } -
Leggi il file riga per riga:
Una volta verificato che il file esiste, puoi utilizzare la classe
System.IO.StreamReaderper leggere il file riga per riga. Ecco il codice per farlo:
powershellCopy codetry {
$reader = [System.IO.StreamReader]::new($filePath)
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
# Process each line here
Write-Host $line
}
$reader.Close()
} catch {
Write-Host "Error reading the file: $_"
}
In questo codice:
- Creiamo una nuova istanza di
System.IO.StreamReaderutilizzando[System.IO.StreamReader]::new($filePath), dove$filePathè il percorso del file. - Utilizziamo un ciclo
whileper leggere il file riga per riga. La condizione$reader.Peek() -ge 0assicura che continuiamo a leggere fino a raggiungere la fine del file. - All’interno del ciclo, utilizziamo
$reader.ReadLine()per leggere ogni riga e processarla secondo necessità. In questo esempio, stiamo semplicemente visualizzando ogni riga utilizzandoWrite-Host, ma puoi eseguire qualsiasi azione desiderata. - Infine, chiudiamo lo
StreamReaderutilizzando$reader.Close()per rilasciare le risorse del file.
Esempio completo di codice funzionante
Ecco un esempio completo di codice funzionante che legge un file riga per riga e visualizza ogni riga:
powershellCopy code# Specify the path to the file
$filePath = "example.txt"
# Check if the file exists
if (Test-Path $filePath) {
try {
# Create a StreamReader to read the file
$reader = [System.IO.StreamReader]::new($filePath)
# Read the file line by line
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
# Process each line here
Write-Host $line
}
# Close the StreamReader
$reader.Close()
} catch {
Write-Host "Error reading the file: $_"
}
} else {
Write-Host "File not found: $filePath"
}
In questo codice:
- Specifichiamo il percorso del file utilizzando la variabile
$filePath. - Verifichiamo se il file esiste utilizzando
Test-Path. - Se il file esiste, creiamo un’istanza di
System.IO.StreamReaderper leggere il file riga per riga e processare ogni riga utilizzando un ciclowhile. - Includiamo la gestione degli errori per catturare eventuali eccezioni che potrebbero verificarsi durante la lettura del file.
Conclusione
In sintesi, PowerShell fornisce diversi metodi versatili per leggere i file riga per riga, soddisfacendo esigenze di scripting e automazione diverse. Get-Content con un ciclo ForEach è una scelta user-friendly per compiti semplici, offrendo semplicità e leggibilità. Get-Content con Foreach-Object migliora la flessibilità, rendendolo adatto a operazioni più complesse e compiti di filtraggio all’interno della pipeline.
Per scenari che richiedono un controllo maggiore e una gestione degli errori completa, la classe [System.IO.File] offre una soluzione potente. Questo metodo consente di ottimizzare le operazioni sui file e gestire elegantemente le eccezioni, rendendolo adatto per script robusti e resistenti agli errori.
In situazioni in cui stai trattando file di grandi dimensioni e l’efficienza della memoria è cruciale, la classe System.IO.StreamReader brilla. Ti consente di leggere i file in modo efficiente mentre gestisci le risorse di memoria in modo più efficace, assicurando un’elaborazione fluida di set di dati sostanziali.
In definitiva, la scelta del metodo dipende dai requisiti specifici del tuo script, dalla dimensione del file e dalla complessità dell’elaborazione. Sfruttando questi metodi, puoi leggere con fiducia i file riga per riga in PowerShell, affrontando efficacemente una vasta gamma di attività relative ai file nei tuoi flussi di lavoro di automazione.
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedInArticolo correlato - PowerShell File
- Come caricare file con FTP in PowerShell
- Come creare un file di testo utilizzando Windows PowerShell
- Come estrarre il nome del file da un percorso utilizzando PowerShell
- Come memorizzare il contenuto di un file di testo in una variabile utilizzando PowerShell
- Come ottenere il percorso completo dei file in PowerShell
