Powershell脚本卡住,从批处理文件调用时不会退出

Pek*_*ica 36 windows powershell

我有一个连接到网站的PowerShell脚本,并解析其返回的数据(它是关于将以前上传的SQL文件导入到网站的数据库中).PowerShell脚本使用wget,稍后我可以用本机函数替换它.

导入过程嵌入在由称为scriptFTP的第三方程序执行的脚本中.

当我从一个.bat文件中调用它时,脚本运行正常:

powershell  "& "C:\data\etc\run_import_script.ps1"
exit %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

但是,当我从更大的ScriptFTP上下文中调用此.bat文件时,会发生以下情况:

  • PowerShell脚本已执行.我确认这是每次调用远程导入脚本时给自己发送一封电子邮件.
  • PowerShell似乎没有退出,脚本执行卡住了.我仍然可以使用Ctrl + C取消整个事情,但以下命令永远不会被执行.

当我将批处理文件更改为以下内容时:

start powershell  "& "C:\data\etc\run_import_script.ps1"
exit %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

工作,在新的控制台中运行PowerShell脚本,但我无法获取PowerShell返回的错误级别.

我试图直接从ScriptFTP调用PowerShell,绕过批处理文件,但结果相同:它只是卡住了.

我有PowerShell脚本的任何输出都使用Write-OutputWrite-Host不显示.

所有程序都在同一个用户下运行,我.

有人有什么想法怎么办?

aph*_*ria 16

尝试添加/ WAIT参数.它会使.bat等待PowerShell脚本完成.

START /WAIT powershell "& "C:\data\etc\run_import_script.ps1"
Run Code Online (Sandbox Code Playgroud)

  • 干杯,这很好用,但我无法以这种方式捕获Powershell的输出 - 如果出现错误,我需要将其包含在控制台输出中. (2认同)

小智 16

根据我的经验,PowerShell.exe可以使用-File开关以可预测的方式轻松地从批处理文件或shell脚本中运行脚本.一个不需要使用Start命令.

重要的是要追加

< nul
Run Code Online (Sandbox Code Playgroud)

到批处理文件中的命令行.我的研究表明,PowerShell的运行中通过-File开关指示的脚本命令,然后等待额外的PowerShell从标准输入命令(我与-Command开关短暂的实验显示类似的行为).通过将标准输入重定向到nul,一旦PowerShell完成执行脚本并从标准输入"读取文件结尾",PowerShell就会退出.

从Cygwin调用PowerShell时,请使用

< /dev/null
Run Code Online (Sandbox Code Playgroud)

例如,我使用shell变量从Cygwin运行PowerShell脚本,如下所示:

PowerShell.exe -ExecutionPolicy RemoteSigned -File $_powershellscriptpath $_firstscriptparameter < /dev/null
Run Code Online (Sandbox Code Playgroud)

如果您的经历与我的不同,请发表评论. - 戈登

  • 谢谢你,非常有用.我发现一个替代方案,当没有从shell启动(而不是控制流)时,使用powershell.exe的"-InputFormat None"参数来禁用输入流. (5认同)

小智 9

我们遇到了类似的问题.我们想从一个只有一个盒子的软件调用一个powershell应用程序来输入"Command"和"Parameters"但是虽然powershell成功运行(我可以看到受影响的文件已更新.)

最后,我的同事帮助我弄明白了Command需要:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 
Run Code Online (Sandbox Code Playgroud)

和参数:

-ExecutionPolicy unrestricted -Command "& {C:\scripts\apps\EDI\Test.ps1; [Environment]::Exit(1)}"
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,重要的是使用[Environment]::Exit(1)而不是Exit 1.我相信Exit只是终止脚本,而不是关闭Powershell本身.