如何将错误输出重定向到日志文件,将标准输出重定向到对象?
- 将stderr重定向到logfile
- 将stdout重定向到对象
我查看了以下内容:
>>
和2>>
只能重定向到文件。
-RedirectStandardOutput
和-RedirectStandardError
又只能再次重定向到文件。
| Out-File
无法重定向stderr。
| Tee-Object
同样有这个问题。
如何将错误输出重定向到日志文件,将标准输出重定向到对象?
我查看了以下内容:
>>
和2>>
只能重定向到文件。
-RedirectStandardOutput
和-RedirectStandardError
又只能再次重定向到文件。
| Out-File
无法重定向stderr。
| Tee-Object
同样有这个问题。
将stdout
和stderr
输出流合并,可以像PetSerAl评论的那样操作,尽管语法不是最直观的。
2>&1
这个奇怪的语法意味着将stderr
(流2)添加到stdout
(流1)中。由于这实际上并不是您想要的,因此请尝试将MS页面上的另一个示例适应为PowerShell:
或者,您可以将输出重定向到一个地方,将错误重定向到另一个地方。
dir file.xxx > output.msg 2> output.err
因此,
$ret = myCommand 2> errors.log
应该将错误信息发送到日志文件中,并将非错误信息存储在$ret
变量中。
在关于重定向 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
. {$object = command} 2>&1 | Out-File logfile
- user40034072>1
会将标准输出和错误输出都重定向到日志文件中,是吗? - Jamie Marshall$object =
)已经捕获了常规输出,因此在那一点上它已经从输出流中删除了。 - Ansgar Wiechers