1

在使用PowerShell-Command -可执行文件选项时,我遇到了以下限制:

Write-Host "SETUP"
Set-PSDebug -Trace 2
Write-Host "TEST ONE"
$foo = "BAR"
Write-Host "TEST TWO"
Get-ChildItem
Write-Host "TEST THREE"
$bar = @"
BAZ
"@
Write-Host "DONE"

如果我将之前的内容保存到test.ps1并执行cat .\test.ps1 | powershell -Command -,我会得到以下输出:

SETUP
DEBUG:    1+  >>>> Write-Host "TEST ONE"
DEBUG:     ! CALL function '<ScriptBlock>'
TEST ONE
DEBUG:    1+  >>>> $foo = "BAR"
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:     ! SET $foo = 'BAR'.
DEBUG:    1+  >>>> Write-Host "TEST TWO"
DEBUG:     ! CALL function '<ScriptBlock>'
TEST TWO
DEBUG:    1+  >>>> Get-ChildItem
DEBUG:     ! CALL function '<ScriptBlock>'


    Directory: C:\empty


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       26/02/2017     15:39            179 test.ps1


DEBUG:    1+  >>>> Write-Host "TEST THREE"
DEBUG:     ! CALL function '<ScriptBlock>'
TEST THREE

如您所见,该Write-Host "DONE"行的输出永远不会显示。

因此,在逐行评估时,这里的字符串似乎发生了一些事情。为什么会这样?

而且,更重要的是,有没有办法让这里的字符串在这种情况下工作?

4

1 回答 1

1

注意:以下适用于 Windows PowerShell v5.1.14393.693 和 PowerShell Core v6.0.0-alpha16。

PetSerAl就像他经常做的那样,在对问题的评论中提供了关键指针(后来,通过评论,也提供了最简单的解决方法):

似乎问题不在于here-strings [本身],而在于多行命令[通常]。

-Command -需要在输入中的最后一个多行命令之后至少有 1 个空行才能正确识别所有命令。

根据定义,here-string 是多行命令的实例,这就是您遇到问题的原因。

因此,要解决包含多行命令的脚本中的问题,请在末尾插入一个空行

Write-Host "SETUP"
Set-PSDebug -Trace 2
Write-Host "TEST ONE"
$foo = "BAR"
Write-Host "TEST TWO"
Get-ChildItem
Write-Host "TEST THREE"
$bar = @"
BAZ
"@
Write-Host "DONE"  # IMPORTANT: Note the empty line below.
 

为什么这是必要的?

答案可以在powershell自己的CLI帮助(powershell -?)中找到,其参数描述-Command以(强调添加)开头:

执行指定的命令(和任何参数),就好像它们是在 Windows PowerShell 命令提示符下键入的一样

在没有PSReadLine加载模块的情况下,当您以交互方式键入多行命令时,您需要额外的击键来提交条目 Enter,以便在您完成输入命令时让 PowerShell 知道。

注意:该PSReadLine模块已成为W10/PSv5中交互式PowerShell 会话的标准部分,谢天谢地,它不需要这种额外的击键,因为它从输入的语法推断命令是否完整。
但是,PSReadLine您通过. 如果您想体验 PowerShell本身如何在交互式会话中解析多行命令,请先执行。 -Command -
Remove-Module PSReadLine

-Command -不幸的是,当用于通过stdin提供命令时应用了相同的逻辑,因此您必须在 input 中使用空行来模拟额外的Enter击键,尽管 PetSerAl 发现最后一个足够了。


如果您希望看到这种行为发生变化和/或希望得到适当的支持-File -以将输入视为脚本,请考虑在GitHub 问题 #3223中发出您的声音。

于 2017-02-26T23:02:20.440 回答