使用 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"
行的输出永远不会显示。
因此,在逐线评估时,似乎有一些正在进行。为什么会发生?
,更重要的是,有没有办法在此上下文中制作在此上下文中工作?
注意:以下适用于Windows PowerShell v5.1.14393.693和PowerShell Core v6.0.0.0.0-alpha16。
preteral of他经常为问题提供了关键的指针,以评论该问题(然后通过评论,也提供了最简单的修复程序):
看来问题不是在这里[本身],而是多行命令[一般]。
-Command -
要求在输入中在输入中以正确识别所有命令。<<<<<<<<<<<<<<
从定义上讲,一个弦是多行命令的实例,这就是为什么您经历了问题。
因此,在包含多行命令的脚本中解决问题,在 end end end 上插入一个空行:: <</em>
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
模块加载,当您键入a 多线命令交互式时,您需要 extra an enter 键键以提交条目,以便让powershell知道输入命令时。
注意:PSReadLine
模块,它成为W10/psv5中 Interactive PowerShell会话的标准部分,值得庆幸的是, supiate 需要这种额外的键键 inters 从命令是否完成的输入的语法中。
但是,当您通过-Command -
传递命令时,PSReadLine
是不涉及的。
如果您想体验PowerShell 本身如何在交互式会话中解析多行命令,请先执行Remove-Module PSReadLine
。
不幸的是,当使用-Command -
通过 stdin 提供命令时,应用相同的逻辑kbd>用空线 中的击键,尽管Perserater弄清楚了 single 空线在末端是够了。
如果您想看到此行为更改和/或希望对-File -
的适当支持以将输入视为 script ,请考虑在Github中听到您的声音#3223。