我想将 PowerShell 命令的 stderr 输出存储在变量中。我不想将其存储在文件中,也不希望包含标准输出,只想包含错误输出。
这会重定向到名为
error.txt
: 的文件
& $command $params 2> error.txt
这会将 stderr 和 stdout 重定向到 $output 变量:
$输出=&$命令$参数2>&1
但我只想将错误输出存储在变量中(与上面 error.txt 文件的内容相同),而不向文件写入任何内容。我该怎么做?
-ErrorVariable
参数:
Invoke-Expression "$command $params" -ErrorVariable badoutput
$badoutput
现在将包含错误字符串的内容。
$badoutput[0].Exception
获取。
-ErrorAction 和 -ErrorVariable 有关如何有效使用 PowerShell 中内置的 ErrorAction 和 ErrorVariable 参数的更多信息。 这是展示此功能的最简单方法:
PS> Stop-Process 13,23
Stop-Process : Cannot find a process with the process identifier 13.
At line:1 char:13
+ Stop-Process <<<< 13,23
Stop-Process : Cannot find a process with the process identifier 23.
At line:1 char:13
+ Stop-Process <<<< 13,23
PS> Stop-Process 13,23 -ErrorAction Stop # Only 1 error
Stop-Process : Command execution stopped because the shell variable “ErrorA
ctionPreference” is set to Stop: Cannot find a process with the process ide
ntifier 13.
At line:1 char:13
+ Stop-Process <<<< 13,23 -ErrorAction Stop # Only 1 error
PS> Stop-Process 13,23 -ErrorAction silentlycontinue # No errors
PS> Stop-Process 13,23 -ErrorAction inquire # ASK
Confirm
Cannot find a process with the process identifier 13.
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is “Y”):h
Stop-Process : Command execution stopped because the user selected the Halt
option.
At line:1 char:13
+ Stop-Process <<<< 13,23 -ErrorAction inquire # ASK
PS>
PS>
PS> Stop-Process 13,23 -ErrorVariable a -ErrorAction SilentlyContinue
PS> $a[0]
Stop-Process : Cannot find a process with the process identifier 13.
At line:1 char:13
+ Stop-Process <<<< 13,23 -ErrorVariable a -ErrorAction SilentlyContinue
PS> $a[0] |fl * -Force
Exception : Microsoft.PowerShell.Commands.ProcessCommandExcepti
on: Cannot find a process with the process identifi
er 13.
TargetObject : 13
CategoryInfo : ObjectNotFound: (13:Int32) [Stop-Process], ProcessC
ommandException
FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Comma
nds.StopProcessCommand
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
PS> $a |ft TargetObject -force -auto
TargetObject
————
13
23
现在人们不明显的一件事是,您可以在 ErrorVariable 的变量名前面指定一个“+”,我们会将错误添加到该变量中。
PS> $err=@()
PS> stop-process 13 -ea silentlycontinue -ErrorVariable err
PS> $err.count
1
PS> stop-process 23 -ea silentlycontinue -ErrorVariable +err
PS> $err.count
2
PS> $err
Stop-Process : Cannot find a process with the process identifier 13.
At line:1 char:13
+ stop-process <<<< 13 -ea silentlycontinue -ErrorVariable err
Stop-Process : Cannot find a process with the process identifier 23.
At line:1 char:13
+ stop-process <<<< 23 -ea silentlycontinue -ErrorVariable +err
最后,您不需要输入 –ErrorAction 或 –ErrorVariable,我们已经为这些定义了参数别名,因此您只需输入
–EA
和
-EV
。Linux + PowerShell 7.2.16、PowerShell 7.3.2
PS> $s={
/bin/echo "Hello"
/bin/ls "/errortext"
Write-Error "Booo"
Write-Host "Bello"
Write-Output "World"
}
PS> $err456 = (Invoke-Command -ScriptBlock $s `
-OutVariable out123 `
-ErrorVariable err123 `
1>$null ) 2>&1
Bello
PS> $out123
Hello
World
PS> $err123
Write-Error: Booo
PS> $err456
/bin/ls: cannot access '/errortext': No such file or directory
Write-Error: Booo