在我阅读错误消息之前,Powershell窗口消失了

jad*_*ero 29 powershell scripting ironpython

当我调用Powershell脚本时,如何保持被调用脚本关闭其命令窗口.我收到一个错误,如果我能读错误,我肯定可以修复它.

我有一个Powershell脚本,它使用.NET类发送带附件的电子邮件.如果我通过从命令行执行脚本或从Windows调度程序调用脚本直接调用脚本,那么它可以正常工作.如果我从另一个脚本(IronPython,如果这很重要)中调用它,那么它就会失败.所有方案在我的开发机器上都能正常工作 (我真的必须得到"在我的机器上工作"的标识!)我已经以一种显示命令窗口的方式调用Powershell,我可以在它关闭之前看到闪烁的红色.

对不起:Powershell 1.0,IronPython 1.1

解决方案:powershell -noexit d:\ script\foo.ps1

-noexit开关工作正常.我刚刚将它添加到我从IronPython传递的参数中.正如我所怀疑的那样,我可以自己解决这个问题(执行政策,虽然我暂时设置为不受限制但没有效果,所以我想我需要深入了解).如果我遇到麻烦,我会问另一个问题.

感谢大家的帮助.我了解到我需要更加密切地研究powershell交换机,并且我可以看到很多将来会证明有用的东西.

Sha*_*evy 47

尝试使用-noexit开关:

powershell -noexit d:\script\foo.ps1
Run Code Online (Sandbox Code Playgroud)


dea*_*dog 22

您基本上有3个选项可以阻止PowerShell控制台窗口关闭,我在博客文章中有更详细的描述.

  1. 一次性修复:从PowerShell控制台运行脚本,或使用-NoExit开关启动PowerShell进程.例如PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
  2. 每脚本修复:在脚本文件末尾添加输入提示.例如Read-Host -Prompt "Press Enter to exit"
  3. 全局修复:更改注册表项以在脚本完成运行后始终打开PowerShell控制台窗口.

以下是要修改选项#3的注册表项:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\powershell.exe\shell\open\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"& \\\"%1\\\"\""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"-Command\" \"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & \\\"%1\\\"\""
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅我的博客,以及将自动应用这些注册表更改的.reg文件.


Kei*_*ill 6

我以前需要这个,通常我不想修改脚本(通常用于从任务计划程序启动的脚本).我只是想看看吐出来的是什么.

您需要做的就是在脚本调用后附加一个Read-Host命令,例如:

PowerShell.exe -command { .\foo.ps1; read-host "Press enter key to continue" }
Run Code Online (Sandbox Code Playgroud)

BTW使用Start-Transcript的问题是它不捕获EXE输出.使用标准主机在V1甚至V2中进行任何形式的尝试日志记录都不会捕获详细,调试,进度或警告流.您只能通过查看关联的主机窗口来查看这些内容.

捕获所有脚本输出(stdout,stderr,verbose,warning,debug)的一种俗气但有效的方法是使用另一个主机,如cmd.exe,例如:

cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log
Run Code Online (Sandbox Code Playgroud)


Ala*_*ald 5

我通常对脚本自动关闭感到满意,除非发生错误,我需要查看错误。假设您没有将 $ErrorActionPreference 更改为默认的“继续”,那么对于我描述的行为,请在脚本末尾执行此操作

if ($Error)
{
    Pause
}
Run Code Online (Sandbox Code Playgroud)