如何在不显示窗口的情况下运行PowerShell脚本?
如何运行PowerShell脚本而不显示窗口或任何其他标志给用户?
换句话说,脚本应该在后台安静地运行,而不会对用户造成任何影响。
额外的功劳,不使用第三方组件的答案:)
你可以像这样运行它(但是这会显示一段时间的窗口):
PowerShell.exe -windowstyle hidden { your script.. }
或者,您使用我创build的帮助程序文件,以避免名为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) 更有趣
(通过这个论坛主题 。)
这是一个不需要命令行参数或单独的启动器的方法。 它不是完全看不见的,因为窗口在启动时会瞬间显示出来。 但是它很快就消失了。 如果你想通过双击资源pipe理器,或者通过开始菜单快捷方式(当然还包括启动子菜单)来启动脚本,那么这就是我认为的最简单的方法。 我喜欢它是脚本本身的代码的一部分,而不是外部的东西。
把它放在脚本的前面:
$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帐户时,popup“交互式服务检测”服务。
使用“CreateNoWindow”参数阻止了ISD服务popup警告。
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("Kernel32.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
如果这个答案对你有帮助,请在这个post的回答中投票给“Bluecakes”。