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

Tho*_*att 110 windows powershell scripting batch-file silent

如何在不向用户显示窗口或任何其他标志的情况下运行PowerShell脚本?

换句话说,脚本应该在后台安静地运行而不向用户发出任何信号.

对于不使用第三方组件的答案的额外信用:)

ste*_*tej 114

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

PowerShell.exe -windowstyle hidden { your script.. }
Run Code Online (Sandbox Code Playgroud)

或者您使用我创建的帮助文件来避免名为PsRun.exe的窗口.您可以在PowerShell中下载源代码和exe文件使用WinForm GUI运行预定任务.我将它用于计划任务.

编辑:正如Marco所说,这个-windowstyle参数仅适用于V2.

  • @ThomasBratt对于计划任务,如果在"安全选项"部分的"常规"选项卡上将任务设置为"运行是否登录用户",我发现PowerShell脚本无需"-WindowStyle Hidden"静默运行. (18认同)
  • 我编译了PsRun,但是,如果我将它添加到计划任务中,它还会闪烁一个窗口...... (6认同)
  • 您至少可以通过使用 `cmd /c start /min "" powershell -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Users\username\Desktop\test.ps1"` 调用 cmd 来绕过窗口闪烁。 (5认同)
  • 同样在这里,也不起作用,因为窗口仍然弹出来运行脚本。它很快退出,但我们正在尝试在后台运行它而不会中断。 (4认同)
  • -windowstyle隐藏并不完全有效。窗口至少会闪烁。 (4认同)
  • 是的,这就是为什么在响应中有“但这会显示一段时间的窗口”的原因。 (2认同)
  • 使用用户帐户到 SYSTEM 还可以避免显示窗口。 (2认同)

ax.*_*ax. 17

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

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden
Run Code Online (Sandbox Code Playgroud)

您也可以使用VBScript执行此操作:http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(通过这个论坛帖子.)


Yus*_*sha 16

我遇到了同样的问题.我发现,如果你去的任务任务计划程序运行的powershell.exe脚本,你可以点击" 运行用户是否登录或不 ",并且任务运行时,将永远不会显示PowerShell窗口.

  • 这个解决方案使我的脚本[无法正常运行](https://superuser.com/q/1563600/149754)。 (3认同)
  • 不依赖于第三方扩展,可执行文件或包装脚本的最佳解决方案。 (2认同)
  • 请注意,此选项要求用户具有“作为批处理作业登录”权限 (2认同)
  • 如果您的脚本涉及显示任何类型的 GUI,则这不是一个解决方案。 (2认同)

And*_*wry 13

这是一种不需要命令行参数或单独的启动器的方法.它不是完全不可见的,因为窗口确实在启动时显示.但它很快消失了.如果您想通过双击资源管理器或通过"开始"菜单快捷方式(当然包括"启动"子菜单)来启动脚本,我认为这是最简单的方法.我喜欢它是脚本本身代码的一部分,而不是外部代码.

把它放在脚本的前面:

$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)
Run Code Online (Sandbox Code Playgroud)


Ada*_*lor 13

这是一个单行:

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

尽管这可能会非常短暂地闪烁一个窗口,但这种情况应该很少发生。

  • 这应该是公认的答案,它是似乎在每种情况下都有效的一种方法(包括在任务调度程序内,这是我的问题)。 (2认同)

Gar*_*ric 10

ps1 也隐藏在任务计划程序和快捷方式中

    mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -ExecutionPolicy Bypass & 'C:\PATH\NAME.ps1'"", 0:close")
Run Code Online (Sandbox Code Playgroud)


小智 6

当您计划任务时,只需在“常规”选项卡下选择“无论用户是否登录都运行”

另一种方法是让任务以另一个用户身份运行。


Ste*_*Ste 6

答案-WindowStyle Hidden很好,但窗口仍然会闪烁。

通过cmd /c start /min "".

您的机器或设置可能不同,但对我来说效果很好。

1.调用文件

cmd /c start /min "" powershell -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Users\username\Desktop\test.ps1"
Run Code Online (Sandbox Code Playgroud)

2. 调用带参数的文件

cmd /c start /min "" powershell -WindowStyle Hidden -ExecutionPolicy Bypass -Command ". 'C:\Users\username\Desktop\test.ps1'; -Arg1 'Hello' -Arg2 ' World'"
Run Code Online (Sandbox Code Playgroud)

3. 用函数和参数调用文件

cmd /c start /min "" powershell -WindowStyle Hidden -ExecutionPolicy Bypass -Command ". 'C:\Users\username\Desktop\test.ps1'; Get-Test -stringTest 'Hello World'"
Run Code Online (Sandbox Code Playgroud)

3. 用函数和参数调用文件的Powershell 内容是:

function Get-Test() {
  [cmdletbinding()]
  Param
  (
    [Parameter(Mandatory = $true, HelpMessage = 'The test string.')]
    [String]$stringTest
    )
  Write-Host $stringTest
  return
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在 Task Scheduler 中运行此程序,则将其%comspec%作为程序/脚本调用,然后作为参数调用上述文件的代码。

在此处输入图片说明

  • 这很有趣,但我实际上发现你可以看到窗口。它只是比其他时候闪烁得快得多,但如果你非常仔细地注意,窗口仍然会弹出。如果您想查看我在说什么,请打开一个窗口窗口(例如资源管理器),您会看到它在另一个窗口获得焦点时短暂失去焦点 (7认同)

jmc*_*jmc 5

我在使用c#运行时出现此问题,在Windows 7上,当运行隐藏的PowerShell窗口作为SYSTEM帐户时,"Interactive Services Detection"服务弹出.

使用"CreateNoWindow"参数阻止了ISD服务弹出它的警告.

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


小智 5

我认为,运行后台脚本时隐藏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
Run Code Online (Sandbox Code Playgroud)

如果此答案对您有帮助,请在本文中的投票中对“ Bluecakes”进行投票

  • 对我来说,控制台仍会显示大约一秒钟。 (2认同)

js2*_*010 5

这是一个控制控制台各种状态的有趣演示,包括最小化和隐藏。

Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
   [DllImport("Kernel32.dll")]
   public static extern IntPtr GetConsoleWindow();
   [DllImport("user32.dll")]
   public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@

$ConsoleMode = @{
 HIDDEN = 0;
 NORMAL = 1;
 MINIMIZED = 2;
 MAXIMIZED = 3;
 SHOW = 5
 RESTORE = 9
 }

$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()

$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"
Run Code Online (Sandbox Code Playgroud)


小智 5

创建一个调用 PowerShell 脚本的快捷方式,并将“运行”选项设置为“最小化”。这将防止窗口闪烁,尽管您仍然会在任务栏上看到运行脚本的短暂提示。


sta*_*x76 5

为了方便命令行使用,有一个简单的包装应用程序:

https://github.com/stax76/run-hidden

命令行示例:

run-hidden powershell -command calc.exe
Run Code Online (Sandbox Code Playgroud)