如何在管道脚本时使用utli-line命令,例如此处的弦



使用 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。

相关内容

  • 没有找到相关文章

最新更新