1

我有一个小脚本,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&

4

0 回答 0