Condividi tramite


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 il Out-File cmdlet quando è necessario usare i relativi parametri, ad esempio , EncodingForce, Widtho NoClobber 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 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 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-Filel'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.

Vedi anche