如何重定向
我看过的东西:
>>
和 2>>
仅重定向到文件 .-RedirectStandardOutput
和 -RedirectStandardError
仅再次重定向到文件。| Out-File
无法重定向 stderr。| Tee-Object
同样的问题。
连接
stdout
和 stderr
输出流的工作原理就像 PetSerAl 评论的那样,尽管语法不是最直观的。
2>&1
奇怪的语法意味着stderr
(流2)将被添加到stdout
(流1)中。由于这实际上不是您想要的,请尝试将 MS 页面中的另一个示例改编为 Powershell:
或者,您可以将输出重定向到一个位置,并将错误重定向到另一个位置。
dir file.xxx > 输出.msg 2> 输出.err
因此,
$ret = myCommand 2> errors.log
应在日志文件中发送错误,并在
$ret
变量中发送非错误。
about_Redirection MSDN 文章中有全面的解释。
stdout
到管道):
PS D:\PShell> -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Output
-15
3
7.5
PS D:\PShell> Get-Content "$env:temp\err.txt"
Attempted to divide by zero.
At line:1 char:28
+ -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Outpu ...
+ ~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
PS D:\PShell>
另一个例子(
stdout
反对):
PS D:\PShell> $x = -1,5,0,2| ForEach-Object { 15/$_} 2>"$env:temp\err.txt"
PS D:\PShell> $x
-15
3
7.5
function GetAnsVal {
param([Parameter(Mandatory=$true, ValueFromPipeline=$true)][System.Object[]][AllowEmptyString()]$Output,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)][System.String]$firstEncNew,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)][System.String]$secondEncNew
)
function ConvertTo-Encoding ([string]$From, [string]$To){#"UTF-8" "CP866" "ASCII" "windows-1251"
Begin{
$encFrom = [System.Text.Encoding]::GetEncoding($from)
$encTo = [System.Text.Encoding]::GetEncoding($to)
}
Process{
$Text=($_).ToString()
$bytes = $encTo.GetBytes($Text)
$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
$encTo.GetString($bytes)
}
}
$all = New-Object System.Collections.Generic.List[System.Object];
$exception = New-Object System.Collections.Generic.List[System.Object];
$stderr = New-Object System.Collections.Generic.List[System.Object];
$stdout = New-Object System.Collections.Generic.List[System.Object]
$i = 0;$Output | % {
if ($_ -ne $null){
if ($_.GetType().FullName -ne 'System.Management.Automation.ErrorRecord'){
if ($_.Exception.message -ne $null){$Temp=$_.Exception.message <#| ConvertTo-Encoding $firstEncNew $secondEncNew#>;$all.Add($Temp);$exception.Add($Temp)}
elseif ($_ -ne $null){$Temp=$_ <#| ConvertTo-Encoding $firstEncNew $secondEncNew#>;$all.Add($Temp);$stdout.Add($Temp)}
} else {
#if (MyNonTerminatingError.Exception is AccessDeniedException)
$Temp=$_.Exception.message <#| ConvertTo-Encoding $firstEncNew $secondEncNew#>;
$all.Add($Temp);$stderr.Add($Temp)
}
}
$i++
}
[hashtable]$return = @{}
$return.Meta0=$all;$return.Meta1=$exception;$return.Meta2=$stderr;$return.Meta3=$stdout;
return $return
}
Add-Type -AssemblyName System.Windows.Forms;
& C:\Windows\System32\curl.exe 'api.ipify.org/?format=plain' 2>&1 | set-variable Output;
$r = & GetAnsVal $Output
[Console]::Write("exception:`n");
$r.Meta1
[Console]::Write("stderr:`n");
$r.Meta2
[Console]::Write("stdout:`n");
$r.Meta3