about_Redirection

Descrizione breve

Viene illustrato 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 ed è possibile reindirizzare l'output degli errori al normale flusso di output.

Per reindirizzare l'output, è possibile usare i metodi seguenti:

  • Usare il cmdlet , che invia l'output Out-File del comando a un file di testo. In genere, si usa il Out-File cmdlet quando è necessario usare i relativi parametri, ad esempio Encodingi parametri , ForceWidth, o NoClobber .

  • Usare il cmdlet , che invia l'output Tee-Object del comando 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 funzionalmente al piping a Out-File senza parametri aggiuntivi.

Per altre informazioni sui flussi, vedere about_Output_Flussi.

Flussi di output reindirizzabili

PowerShell supporta il reindirizzamento dei flussi di output seguenti.

Flusso # Descrizione Introdotto in Write Cmdlet
1 Flusso di successo PowerShell 2.0 Write-Output
2 Flusso di errori PowerShell 2.0 Write-Error
3 Flusso di avviso PowerShell 3.0 Write-Warning
4 Flusso dettagliato PowerShell 3.0 Write-Verbose
5 Flusso di debug PowerShell 3.0 Write-Debug
6 Flusso di informazioni PowerShell 5.0 Write-Information, Write-Host
* Tutti i Flussi PowerShell 3.0

È disponibile anche un flusso Progress in PowerShell, ma non supporta il reindirizzamento.

Importante

I flussi Success e Error 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 ) è l'impostazione predefinita se non viene specificato alcun flusso.

Operatore Description Sintassi
> Inviare il flusso specificato a un file. n>
>> Accodare 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 altri flussi solo al flusso Success .

Esempi

Esempio 1: Reindirizzare gli errori e l'output a un file

Questo esempio viene eseguito dir su un elemento che ha esito positivo e uno che ha esito negativo.

dir C:\, fakepath 2>&1 > .\dir.log

2>&1 Usa per reindirizzare il flusso di errori al flusso Success e > per inviare il flusso Success risultante a un file denominatodir.log

Esempio 2: Inviare tutti i dati del flusso success a un file

In questo esempio vengono inviati tutti i dati del flusso Success a un file denominato script.log.

.\script.ps1 > script.log

Esempio 3: Inviare flussi di operazione riuscita, avviso ed errore 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 di avviso al flusso Operazione riuscita .
  • 2>&1 reindirizza il flusso di errori al flusso Success (che ora include anche tutti i dati del flusso di avviso )
  • >reindirizza il flusso Success (che ora contiene sia flussi di avviso che di errore) a un file denominato C:\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 del flusso di informazioni e dell'host di scrittura

In questo esempio vengono eliminati tutti i dati del flusso di informazioni. Per altre informazioni sui cmdlet del flusso di informazioni , vedere Write-Host e Write-Information

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Esempio 6: Mostra l'effetto delle preferenze di azione

Le variabili e i parametri preferenza azione possono modificare ciò che viene scritto in un flusso specifico. 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 è 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 è di sola lettura, nascosto o di sistema, il reindirizzamento ha esito negativo. Gli operatori di reindirizzamento di accodamento (>> e n>>) non scrivono in un file di sola lettura, ma aggiungono contenuto a un file di sistema o 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 cui è in esecuzione. Ad esempio, quando si registra l'output della tabella in un 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 in modo arbitrario nei sistemi in cui viene eseguito lo script, è preferibile che l'output della tabella in formato PowerShell venga restituito ai 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. Invece di dover aggiungere -Width 2000 ovunque si richiama Out-File, è possibile usare la $PSDefaultParameterValues variabile per impostare questo valore per tutti gli utilizzi del Out-File cmdlet in uno script. Inoltre, poiché gli operatori di reindirizzamento (> e >>) sono alias efficaci per Out-File, l'impostazione del Out-File:Width parametro per l'intero script influisce 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 durante la registrazione dell'output formattato della tabella. Se si registrano molti dati tabulari nel 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 è necessario inviare tramite pipe l'output prima Format-Table -AutoSize dell'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 di dati binari

PowerShell non supporta il reindirizzamento dei dati binari. Se si reindirizzano 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 using > 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.

Vedi anche