如何在不显示窗口的情况下运行PowerShell脚本?

如何运行PowerShell脚本而不显示窗口或任何其他标志给用户?

换句话说,脚本应该在后台安静地运行,而不会对用户造成任何影响。

额外的功劳,不使用第三方组件的答案:)

你可以像这样运行它(但是这会显示一段时间的窗口):

PowerShell.exe -windowstyle hidden { your script.. } 

或者,您使用我创建的帮助程序文件,以避免名为PsRun.exe的窗口,正是这样做。 您可以下载源文件和exe文件在PowerShell中使用WinForm GUI运行计划任务 。 我用它来安排任务。

编辑:正如Marco指出的那样-windowstyle参数仅适用于V2。

您可以使用PowerShell社区扩展并执行以下操作:

 start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden 

你也可以用VBScript来做到这一点: http : //blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

  • 安排隐藏的PowerShell任务 (Internet Archive)

  • 预定的PowerShell (Internet Archive) 更有趣

(通过这个论坛主题 。)

这是一个不需要命令行参数或单独的启动器的方法。 它不是完全看不见的,因为窗口在启动时会瞬间显示出来。 但是它很快就消失了。 如果你想通过双击资源管理器,或者通过开始菜单快捷方式(当然还包括启动子菜单)来启动脚本,那么这就是我认为的最简单的方法。 我喜欢它是脚本本身的代码的一部分,而不是外部的东西。

把它放在脚本的前面:

 $t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);' add-type -name win -member $t -namespace native [native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0) 

从c#运行时,我遇到了这个问题,在Windows 7上,运行一个隐藏的PowerShell窗口作为SYSTEM帐户时,弹出“交互式服务检测”服务。

使用“CreateNoWindow”参数阻止了ISD服务弹出警告。

 process.StartInfo = new ProcessStartInfo("powershell.exe", String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand)) { WorkingDirectory = executablePath, UseShellExecute = false, CreateNoWindow = true }; 

这里是一个单行的:

 mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close") 

尽管这可能会使窗口非常短暂地闪烁,但这应该是一种罕见的现象。

我认为在运行后台脚本时隐藏PowerShell的控制台屏幕的最好方法就是这个代码 (“ Bluecakes ”答案)。

我在我需要在后台运行的所有PowerShell脚本的开始处添加此代码。

 # .Net methods for hiding/showing the console in the background Add-Type -Name Window -Namespace Console -MemberDefinition ' [DllImport("coreel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); ' function Hide-Console { $consolePtr = [Console.Window]::GetConsoleWindow() #0 hide [Console.Window]::ShowWindow($consolePtr, 0) } Hide-Console 

如果这个答案对你有帮助,请在这个帖子的回答中投票给“蓝蛋”。