about_Redirection

簡短描述

說明如何將 PowerShell 的輸出重新導向至文字檔。

詳細描述

根據預設,PowerShell 會將輸出傳送至 PowerShell 主機。 這通常是主控台應用程式。 不過,您可以將輸出重新導向至文字檔,並將錯誤輸出重新導向至一般輸出資料流程。

您可以使用下列方法來重新導向輸出:

  • Out-File使用 Cmdlet,它會將命令輸出傳送至文字檔。 一般而言,當您 Out-File 需要使用 Cmdlet 參數時,請使用 Cmdlet,例如 EncodingForceWidthNoClobber 參數。

  • Tee-Object使用 Cmdlet,將命令輸出傳送至文字檔,然後將它傳送至管線。

  • 使用 PowerShell 重新導向運算子。 使用重新導向運算子搭配檔案目標的功能相當於沒有額外參數的管線 Out-File

如需資料流程的詳細資訊,請參閱 about_Output_Streams

可重新導向的輸出資料流程

PowerShell 支援下列輸出資料流程的重新導向。

流# 描述 中引進 寫入 Cmdlet
1 成功 串流 PowerShell 2.0 Write-Output
2 錯誤 資料流程 PowerShell 2.0 Write-Error
3 警告 資料流程 PowerShell 3.0 Write-Warning
4 詳細資訊串流 PowerShell 3.0 Write-Verbose
5 偵錯 資料流程 PowerShell 3.0 Write-Debug
6 資訊 串流 PowerShell 5.0 Write-Information, Write-Host
* 所有資料流程 PowerShell 3.0

PowerShell 中也有 進度 資料流程,但不支援重新導向。

重要

成功 錯誤 資料流程類似于其他殼層的 stdout 和 stderr 資料流程。 不過,stdin 未連線到 PowerShell 管線以進行輸入。

PowerShell 重新導向運算子

PowerShell 重新導向運算子如下所示,其中 n 代表資料流程編號。 如果未指定任何資料流程,則成功 資料流程 ( 1 ) 是預設值。

運算子 描述 語法
> 將指定的資料流程傳送至檔案。 n>
>> 將指定的資料流程附加 至檔案。 n>>
>&1 指定的資料流程重新導向至 成功 資料流程。 n>&1

注意

不同于某些 Unix 殼層,您只能將其他資料流程重新導向至 成功 資料流程。

範例

範例 1:將錯誤和輸出重新導向至檔案

這個範例會在一個成功的專案上執行 dir ,另一個專案會失敗。

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

它會使用 2>&1 將錯誤 資料流程重新 導向至 成功資料流程,並將 > 產生的 Success 資料流程傳送至名為 的檔案dir.log

範例 2:將所有成功串流資料傳送至檔案

此範例會將所有 Success 資料流程資料傳送至名為 的 script.log 檔案。

.\script.ps1 > script.log

範例 3:將成功、警告和錯誤資料流程傳送至檔案

此範例示範如何結合重新導向運算子來達成所需的結果。

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1會將警告資料流程重新 導向至 成功 資料流程。
  • 2>&1 錯誤 資料流程重新導向至 成功 資料流程(現在也包含所有 警告 資料流程資料)
  • > 成功 資料流程 (現在同時 包含警告 錯誤 資料流程) 重新導向至名為 C:\temp\redirection.log 的檔案。

範例 4:將所有資料流程重新導向至檔案

此範例會將呼叫 之腳本 script.ps1 的所有資料流程輸出傳送至名為 script.log 的檔案。

.\script.ps1 *> script.log

範例 5:隱藏所有寫入主機和資訊資料流程資料

此範例會隱藏所有資訊資料流程資料。 若要深入瞭解 資訊 資料流程 Cmdlet,請參閱 Write-Host Write-Information

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

範例 6:顯示動作喜好設定的效果

動作喜好設定變數和參數可以變更寫入特定資料流程的內容。 此範例中的腳本會示範 的值 $ErrorActionPreference 如何影響寫入錯誤 資料流程的內容

$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'

當我們執行此腳本時,系統會在 設定為 Inquire$ErrorActionPreference 收到提示。

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.

當我們檢查記錄檔時,我們會看到下列內容:

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

備註

未附加資料的重新導向運算子 ( >n> ) 會覆寫指定檔案的目前內容,而不會發出警告。

不過,如果檔案是唯讀、隱藏或系統檔案,則重新導向 會失敗 。 附加重新導向運算子 ( >>n>> ) 不會寫入唯讀檔案,但會將內容附加至系統或隱藏的檔案。

若要強制將內容重新導向至唯讀、隱藏或系統檔案,請使用 Out-File Cmdlet 搭配其 Force 參數。

當您寫入檔案時,重新導向運算子會使用 UTF8NoBOM 編碼。 如果檔案有不同的編碼方式,則輸出可能無法正確格式化。 若要以不同的編碼方式寫入檔案,請使用 Out-File Cmdlet 搭配其 Encoding 參數。

寫入檔案時的輸出寬度

當您使用 Out-File 或 重新導向運算子寫入檔案時,PowerShell 會根據執行中的主控台寬度,將資料表輸出格式化為檔案。 例如,使用類似 Get-ChildItem Env:\Path > path.log 主控台寬度設定為 80 個數據行之系統上的命令將資料表輸出記錄到檔案時,檔案中的輸出會截斷為 80 個字元:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

考慮到主控台寬度可能會在執行腳本的系統上任意設定,您可能會偏好根據您指定的寬度,將 PowerShell 格式資料表輸出設定為檔案。

Cmdlet Out-File 提供 Width 參數,可讓您設定您想要用於資料表輸出的寬度。 您不必在叫用 的任何位置 Out-File 新增 -Width 2000 ,而是可以使用 $PSDefaultParameterValues 變數,針對腳本中 Cmdlet 的所有使用方式 Out-File 設定此值。 由於 重新導向運算子 ( >>> ) 實際上是 的 Out-File 別名,因此 Out-File:Width 設定整個腳本的參數也會影響重新導向運算子的格式寬度。 將下列命令放在腳本頂端附近,以針對整個腳本進行設定 Out-File:Width

$PSDefaultParameterValues['out-file:width'] = 2000

當記錄資料表格式化輸出時,增加輸出寬度會增加記憶體耗用量。 如果您要將許多表格式資料記錄到檔案,而且您知道可以透過較小的寬度取得,請使用較小的寬度。

在某些情況下,例如 Get-Service 輸出,若要使用額外的寬度,您必須在輸出至檔案之前透過管線傳送輸出 Format-Table -AutoSize

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

如需 的詳細資訊 $PSDefaultParameterValues ,請參閱 about_Preference_Variables

重新導向二進位資料

PowerShell 不支援二進位資料的重新導向。 如果您重新導向位元組資料流程資料,PowerShell 會將資料視為字串。 此重新導向會導致資料損毀。

比較運算子的潛在混淆

>運算子不會與 大於 比較運算子混淆(通常如 > 其他程式設計語言所示)。

視所比較的物件而定,使用 > 的輸出看起來可能正確(因為 36 不大於 42)。

PS> if (36 > 42) { "true" } else { "false" }
false

不過,本機檔案系統的檢查可以看到已寫入名為 42 的檔案,且內容為 36

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

嘗試使用反向比較 < (小於),會產生系統錯誤:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

如果數值比較是必要作業, -lt-gt 應該使用 。 如需詳細資訊,請參閱 -gt about_Comparison_Operators 中的 運算子。

另請參閱