about_Redirection
Breve descrizione
Illustra come reindirizzare l'output da PowerShell ai file di testo.
Descrizione lunga
Per impostazione predefinita, PowerShell invia l'output all'host di PowerShell. In genere si tratta dell'applicazione console. Tuttavia, è possibile reindirizzare l'output a un file di testo e è possibile reindirizzare l'output degli errori al flusso di output regolare.
È possibile usare i metodi seguenti per reindirizzare l'output:
Usare il cmdlet, che invia l'output dei
Out-File
comandi a un file di testo. In genere, si usa ilOut-File
cmdlet quando è necessario usare i relativi parametri, ad esempio ,Encoding
Force
,Width
oNoClobber
parametri.Usare il cmdlet, che invia l'output
Tee-Object
dei comandi a un file di testo e quindi lo invia alla pipeline.Usare gli operatori di reindirizzamento di PowerShell. L'uso dell'operatore di reindirizzamento con una destinazione file equivale in modo funzionale al piping a
Out-File
senza parametri aggiuntivi.
Per altre informazioni sui flussi, vedere about_Output_Streams.
Flussi di output reindirizzabili
PowerShell supporta il reindirizzamento dei flussi di output seguenti.
Stream # | Descrizione | Introdotto in | Cmdlet di scrittura |
---|---|---|---|
1 | Stream riuscita | PowerShell 2.0 | Write-Output |
2 | Errore Stream | PowerShell 2.0 | Write-Error |
3 | Avviso Stream | PowerShell 3.0 | Write-Warning |
4 | Stream dettagliato | PowerShell 3.0 | Write-Verbose |
5 | Eseguire il debug Stream | PowerShell 3.0 | Write-Debug |
6 | Informazioni Stream | PowerShell 5.0 | Write-Information , Write-Host |
* | Tutti i flussi | PowerShell 3.0 |
Esiste anche un flusso Progress in PowerShell, ma non supporta il reindirizzamento.
Importante
I flussi di esito positivo e di errore sono simili ai flussi stdout e stderr di altre shell. Tuttavia, stdin non è connesso alla pipeline di PowerShell per l'input.
Operatori di reindirizzamento di PowerShell
Gli operatori di reindirizzamento di PowerShell sono i seguenti, dove n
rappresenta il numero di flusso. Il flusso Success ( 1
) è il valore predefinito se non viene specificato alcun flusso.
Operatore | Descrizione | Sintassi |
---|---|---|
> |
Inviare il flusso specificato a un file. | n> |
>> |
Aggiungere il flusso specificato a un file. | n>> |
>&1 |
Reindirizza il flusso specificato al flusso Success . | n>&1 |
Nota
A differenza di alcune shell Unix, è possibile reindirizzare solo altri flussi al flusso Success .
Esempio
Esempio 1: Reindirizzare errori e output a un file
Questo esempio viene eseguito dir
su un elemento che ha esito positivo e su un elemento che ha esito negativo.
dir C:\, fakepath 2>&1 > .\dir.log
Usa 2>&1
per reindirizzare il flusso di errori al flusso Success e >
per inviare il flusso successant risultante a un file denominatodir.log
Esempio 2: Inviare tutti i dati del flusso di successo a un file
In questo esempio vengono inviati tutti i dati di flusso success a un file denominato script.log
.
.\script.ps1 > script.log
Esempio 3: Inviare flussi di errore, avviso e esito positivo a un file
In questo esempio viene illustrato come combinare gli operatori di reindirizzamento per ottenere un risultato desiderato.
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
3>&1
reindirizza il flusso avviso al flusso Success .2>&1
reindirizza il flusso di errori al flusso Success (che ora include anche tutti i dati del flusso di avvisi )>
reindirizza il flusso Success (che ora contiene flussi di avviso ed errore ) a un file denominatoC:\temp\redirection.log
.
Esempio 4: Reindirizzare tutti i flussi a un file
In questo esempio viene inviato l'output di tutti i flussi da uno script denominato script.ps1
a un file denominato script.log
.
.\script.ps1 *> script.log
Esempio 5: Eliminare tutti i dati di flusso di informazioni e Write-Host
In questo esempio vengono eliminati tutti i dati del flusso di informazioni. Per altre informazioni sui cmdlet di flusso di informazioni, vedere Write-Host e Write-Information
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Esempio 6: Visualizzare l'effetto delle preferenze di azione
Le variabili e i parametri delle preferenze azione possono modificare gli elementi scritti in un determinato flusso. Lo script in questo esempio mostra come il valore di $ErrorActionPreference
influisce su ciò che viene scritto nel flusso di errori .
$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
get-item /not-here 2>&1 >> log.txt
}
catch {
"`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt
$ErrorActionPreference = 'Continue'
Quando si esegue questo script viene richiesto quando $ErrorActionPreference
viene impostato su Inquire
.
PS C:\temp> .\test.ps1
Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
23 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The running command stopped because the user selected the Stop option.
Quando si esamina il file di log, viene visualizzato quanto segue:
PS C:\temp> Get-Content .\log.txt
Continue
Get-Item: C:\temp\test.ps1:3
Line |
3 | get-item /not-here 2>&1 >> log.txt
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot find path 'C:\not-here' because it does not exist.
SilentlyContinue
Stop
Error caught!
Ignore
Inquire
Note
Gli operatori di reindirizzamento che non aggiungono dati (>
e n>
) sovrascrivono il contenuto corrente del file specificato senza avviso.
Tuttavia, se il file è un file di sola lettura, nascosto o di sistema, il reindirizzamento ha esito negativo. Gli operatori di reindirizzamento accodamento (>>
e n>>
) non scrivono in un file di sola lettura, ma aggiungono contenuto a un sistema o a un file nascosto.
Per forzare il reindirizzamento del contenuto a un file di sola lettura, nascosto o di sistema, usare il cmdlet con il Out-File
relativo Force
parametro.
Quando si scrive in file, gli operatori di reindirizzamento usano UTF8NoBOM
la codifica. Se il file ha una codifica diversa, l'output potrebbe non essere formattato correttamente. Per scrivere in file con una codifica diversa, usare il cmdlet con il Out-File
relativo Encoding
parametro.
Larghezza dell'output durante la scrittura in un file
Quando si scrive in un file usando Out-File
o gli operatori di reindirizzamento, PowerShell formatta l'output della tabella nel file in base alla larghezza della console in esecuzione. Ad esempio, quando si registra l'output della tabella nel file usando un comando come Get-ChildItem Env:\Path > path.log
in un sistema in cui la larghezza della console è impostata su 80 colonne, l'output nel file viene troncato a 80 caratteri:
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
Considerando che la larghezza della console può essere impostata arbitrariamente nei sistemi in cui viene eseguito lo script, è consigliabile che l'output della tabella di formato di PowerShell sia impostato su file in base a una larghezza specificata.
Il Out-File
cmdlet fornisce un parametro Width che consente di impostare la larghezza desiderata per l'output della tabella. Anziché dover aggiungere -Width 2000
ovunque si richiama Out-File
, è possibile usare la $PSDefaultParameterValues
variabile per impostare questo valore per tutti gli usi del Out-File
cmdlet in uno script. Poiché gli operatori di reindirizzamento (>
e >>
) sono in modo efficace alias per , l'impostazione Out-File:Width
del parametro per Out-File
l'intero script influisce anche sulla larghezza di formattazione per gli operatori di reindirizzamento. Inserire il comando seguente nella parte superiore dello script da impostare Out-File:Width
per l'intero script:
$PSDefaultParameterValues['out-file:width'] = 2000
L'aumento della larghezza di output aumenterà il consumo di memoria quando si registra l'output formattato della tabella. Se si registrano molti dati tabulari in file e si sa che è possibile ottenere con una larghezza più piccola, usare la larghezza più piccola.
In alcuni casi, ad esempio Get-Service
l'output, per usare la larghezza aggiuntiva, sarà necessario inviare l'output tramite Format-Table -AutoSize
pipe prima di eseguire l'output nel file.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Per altre informazioni su $PSDefaultParameterValues
, vedere about_Preference_Variables.
Reindirizzamento dei dati binari
PowerShell non supporta il reindirizzamento dei dati binari. Se si reindirizza i dati del flusso di byte, PowerShell considera i dati come stringhe. Questo reindirizzamento genera dati danneggiati.
Potenziale confusione con gli operatori di confronto
L'operatore >
non deve essere confuso con l'operatore di confronto Greater-than (spesso indicato come >
in altri linguaggi di programmazione).
A seconda degli oggetti confrontati, l'output con >
può sembrare corretto perché 36 non è maggiore di 42.
PS> if (36 > 42) { "true" } else { "false" }
false
Tuttavia, un controllo del file system locale può vedere che un file denominato 42
è stato scritto, con il contenuto 36
.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
Il tentativo di usare il confronto <
inverso (minore di), restituisce un errore di sistema:
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
Se il confronto numerico è l'operazione -lt
necessaria e -gt
deve essere usato. Per altre informazioni, vedere l'operatore -gt
in about_Comparison_Operators.