我有一个小脚本,C:\so\test.ps1
,其内容是:
Invoke-Expression 'using module .\notarealmodule.psm1'
该脚本故意引用一个不存在的模块以引发错误。
当我在没有重定向的情况下运行此脚本时,我会在以下位置收到预期的输出$out
:
PS C:\so> $out = & "C:\Program Files\PowerShell\7\pwsh.exe" -File ".\test.ps1"
PS C:\so> $out
Invoke-Expression: C:\so\test.ps1:1
Line |
1 | Invoke-Expression 'using module .\notarealmodule.psm1'
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The specified module 'C:\so\notarealmodule.psm1' was not loaded because no valid module file was found in any
| module directory.
但是,一旦我添加重定向,输出为空:
PS C:\so> $out = & "C:\Program Files\PowerShell\7\pwsh.exe" -File ".\test.ps1" 2>&1
PS C:\so> $out
PS C:\so> $out = & "C:\Program Files\PowerShell\7\pwsh.exe" -File ".\test.ps1" 1>$null
PS C:\so> $out
PS C:\so> $out = & "C:\Program Files\PowerShell\7\pwsh.exe" -File ".\test.ps1" 2>$null
PS C:\so> $out
这里发生了什么??
我能够用System.Diagnostics.Process
. 以下是 的内容C:\so\testprocess.ps1
:
$proc = [System.Diagnostics.Process]::new()
$proc.StartInfo.FileName = "C:\Program Files\PowerShell\7\pwsh.exe"
$proc.StartInfo.Arguments = "-File $PSScriptRoot\test.ps1"
$proc.StartInfo.UseShellExecute = $false
$proc.StartInfo.RedirectStandardOutput = $true
$proc.StartInfo.RedirectStandardError = $true
$proc.StartInfo.CreateNoWindow = $true
[void]($proc.Start())
Write-Host ($proc.StandardOutput.ReadToEnd())
Write-Host ($proc.StandardError.ReadToEnd())
[void]($proc.WaitForExit())
运行此脚本时不输出任何内容。
PS C:\so> .\testprocess.ps1
PS C:\so>
此问题在 PS 7.1.0 上无法重现:
PS C:\so> $out = & "C:\Program Files\PowerShell\7\pwsh.exe" -File ".\test.ps1" 2>&1
PS C:\so> $out
Invoke-Expression: C:\so\test.ps1:1
Line |
1 | Invoke-Expression 'using module .\notarealmodule.psm1'
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The specified module 'C:\so\notarealmodule.psm1' was not loaded because no valid module file was found in any
| module directory.
PS C:\so>.\testprocess.ps1
Invoke-Expression: C:\so\test.ps1:1
Line |
1 | Invoke-Expression 'using module .\notarealmodule.psm1'
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The specified module 'C:\so\notarealmodule.psm1' was not loaded because no valid module file was found in any
| module directory.
PS C:\so>
PS 7.0.0 发生了什么样的邪恶巫术,错误消息在Invoke-Expression
没有重定向的情况下出现,但没有出现在???的输出中 是否有只有(没有重定向)知道的第三个流(除了标准输出/标准错误) ?$out
&
System.Diagnostics.Process
&