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

时间:2009-08-26 20:21:09

标签: powershell scripting ironpython

当我调用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开关,并且我可以看到很多将来会证明有用的东西。

12 个答案:

答案 0 :(得分:45)

尝试使用-noexit开关:

powershell -noexit d:\script\foo.ps1

答案 1 :(得分:21)

您基本上有3个选项可以阻止PowerShell控制台窗口关闭,我描述了in more detail on my blog post

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

您有三种选择:

  • 在脚本中执行捕获(如果使用 Powershell V2
  • 写一个假人 捕获和重定向的脚本 然后你可以访问的stdout 您的IronPython脚本中的变量。 VBS/Wscript Intro增加 这只是自由落体 到处都是Read-Host个命令, 并点击返回页面。
  • 不是向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" 工作得很好