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 ilOut-File
cmdlet quando è necessario usare i relativi parametri, ad esempioEncoding
i parametri ,Force
Width
, oNoClobber
.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 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 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per