当我调用Powershell脚本时,如何让被调用脚本关闭其命令窗口。我收到错误,如果我能读错误,我确定可以修复它。
我有一个Powershell脚本,它使用.NET类发送带附件的电子邮件。如果我通过从命令行执行脚本或从Windows调度程序调用脚本直接调用脚本,那么它可以正常工作。如果我从另一个脚本(IronPython,如果这很重要)中调用它,那么它就会失败。所有方案在我的开发机器上都能正常工作(我真的必须得到“Works on My Machine”徽标!)我已经以一种显示命令窗口的方式调用Powershell,我可以在关闭之前看到闪烁的红色。
抱歉:Powershell 1.0,IronPython 1.1
解决方案:powershell -noexit d:\ script \ foo.ps1
-noexit开关工作正常。我刚刚将它添加到我从IronPython传递的参数中。正如我所怀疑的那样,我可以自己解决这个问题(执行政策,虽然我暂时设置为不受限制但没有效果,所以我想我需要深入了解)。如果我遇到麻烦,我会问另一个问题。
感谢大家的帮助。我了解到我需要更加密切地研究powershell开关,并且我可以看到很多将来会证明有用的东西。
答案 0 :(得分:45)
尝试使用-noexit
开关:
powershell -noexit d:\script\foo.ps1
答案 1 :(得分:21)
您基本上有3个选项可以阻止PowerShell控制台窗口关闭,我描述了in more detail on my blog post。
PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
Read-Host -Prompt "Press Enter to exit"
以下是要修改选项#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\\\"\""
有关详细信息,请参阅my blog;自动应用这些注册表更改的.reg文件。
答案 2 :(得分:6)
之前我需要这个,通常我不想修改脚本(通常用于从Task Scheduler中触发的脚本)。我只是想看看吐出来的是什么。
您需要做的只是在脚本调用后附加一个Read-Host命令,例如:
PowerShell.exe -command { .\foo.ps1; read-host "Press enter key to continue" }
BTW使用Start-Transcript的问题是它不捕获EXE输出。使用标准主机在V1甚至V2中进行任何形式的尝试日志记录都不会捕获详细,调试,进度或警告流。您只能通过查看关联的主机窗口来查看这些内容。
捕获所有脚本输出(stdout,stderr,verbose,warning,debug)的一种简洁但有效的方法是使用其他主机,例如cmd.exe,例如:
cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log
答案 3 :(得分:2)
在Powershell中没有普通的Try ... Catch构造;但是你可以捕获异常并做出正确反应。 I.E:
Function Example() {
trap [Exception] {
write-host "We have an error!";
write-error $("ERROR: " + $_.Exception.Message);
sleep 30;
break;
}
write-host "Hello world!";
throw "Something very bad has happened!";
}
您还可以模拟Try ... Catch构造:
Function Example2() {
${
write-host "Our try clause...";
throw "...caused an exception! It hurts!";
}
trap [Exception] {
write-error $_.Exception.Message;
sleep 30;
continue;
}
当然,只要您捕获异常,就可以使用错误消息记录,睡眠或任何您想要的内容。我的例子只是睡觉,允许你阅读发生的事情,但记录所有错误要好得多。 (最简单的方法是使用>>重定向它们。)。
还请注意: http://huddledmasses.org/trap-exception-in-powershell/
答案 4 :(得分:1)
您有三种选择:
不是向shell输出任何内容,而是将powershell脚本包装在重定向所有output to a log file的第二个脚本中。
PS C:> myscript.ps1 | Out-File myscript.log
答案 5 :(得分:1)
快速而肮脏的解决方案是使用 CTRL + S 来停止显示的滚动和 CTRL + Q < / kbd>恢复它。
答案 6 :(得分:1)
我的解决方案是使用控制台窗口中的命令行执行脚本,而不是右键单击文件 - &gt;使用powershell执行。
控制台会一直显示错误消息, 即使脚本的执行结束了。
答案 7 :(得分:1)
我通常对自动关闭脚本没问题除非发生错误,我需要在那里查看错误。假设您没有将 $ErrorActionPreference 更改为远离默认的“继续”,那么对于我描述的行为,请在脚本末尾执行此操作
if ($Error)
{
Pause
}
答案 8 :(得分:0)
您是否考虑过将stdout和stderr重定向到ex:
文件./ascript.ps1> logs 2&gt;&amp; 1
注意:您可以在powershell中创建包装器脚本,调用PowerShell脚本并进行所有必要的重定向。
答案 9 :(得分:0)
还有一些想法......您可以在脚本末尾使用start-sleep cmdlet为您提供足够的时间来查看错误。
您也可以使用start-transcript将会话记录到文本文件中。
答案 10 :(得分:0)
创建包含
的run_ps_script.bat
文件
@PowerShell.exe -command "try { %1 } finally { read-host 'Press ENTER...' }"
并将其设为默认程序以打开PowerShell
scrips。
答案 11 :(得分:0)
我的 .PS1 脚本在 Powershell 控制台上运行良好,但是当“双击”或“使用 powershell 右键单击打开”时,它会出现“打开/关闭”问题。
我的解决方法是将脚本文件夹重命名为没有空格的名称。
然后一切正常 - Windows 无法处理 “C:\这是我的文件夹\myscript.ps1”但是 "C:\This_is_my_folder\myscript.ps1" 工作得很好