PowerShell启动进程时隐藏窗口

方法一


在C#的System.Diagnostics.ProcessStartinfo类可以支持设置进程启动时隐藏窗口,今天再来分享一个使用WMI对象的的方法来隐藏启动程序的窗口。使用Win32_Process可以直接启动一个进程,但是缺少对这个进程的控制:比如让它隐藏自己的窗口。下面的的例子可以做到这一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function start-hiddenproc {
[CmdletBinding()]
param(
[string]$processname = 'notepad.exe'
)

$startclass = Get-CimClass -ClassName Win32_ProcessStartup
$startinfo = New-CimInstance -CimClass $startclass -Property @{ShowWindow = 0} -ClientOnly

$class = Get-CimClass -ClassName Win32_Process
Invoke-CimMethod -CimClass $class -MethodName Create -Arguments @{
Commandline = $processname;
ProcessStartupInformation = [CimInstance]$startinfo
}
}

该函数将要执行的进程的路径作为参数,这也方便你在脚本中加入验证路径是否存在的逻辑。

获取到Win32_ProcessStartup类,然后使用它创建一个启动信息实例。

New-CimInstance的参数ClientOnly有一个别名: –Local。与参数的别名相比,我通常更喜欢使用参数的全名。这样更方便用户去查阅帮助文档。

获取到Win32_Process类,然后在Invoke-CimMethod中使用它的Create方法,将上面演示的的参数传递给它。  

方法二


  1.启动PowerShell时隐藏自己的窗口 假如我在计划任务中定时通过Powershell.exe来执行一个脚本文件,我想隐藏这个窗口,此时我们可以考虑使用PowerShell.exe的选项参数: -WindowStyle 将窗口样式设置为 Normal、Minimized、Maximized 或 Hidden。 使用方法:

PowerShell.exe -WindowStyle Hidden -file '脚本.ps1'

  2.在PowerShell启动其它进程时隐藏窗口

Start-Process notepad.exe -WindowStyle Hidden

  3.使用PowerShell隐藏其它进程的窗口 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Add-Type @'
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
'@ -name “Win32ShowWindowAsync” -namespace Win32API
Function Set-ProcessWindowStyle
{
param(
[Parameter(
Mandatory=$true,
ValueFromPipeline=$true)]
[System.Diagnostics.Process]$Process,
[ValidateSet("Show", "Minimized","Maximized","Hidden")]
[string]$WindowStyle="Show"
)
$WinStateInt = 1
switch($WindowState)
{
"Hidden" {$WinStateInt = 0}
"Show" {$WinStateInt = 1}
"Maximize" {$WinStateInt = 3}
"Minimize" {$WinStateInt = 6}
}
[Win32API.Win32ShowWindowAsync]::ShowWindowAsync($Process.MainWindowHandle,$WindowState)
}

使用方法:

Get-Process notepad Set-ProcessWindowStyle -WindowStyle Hidden

PS:如果关联进程没有主窗口,则 MainWindowHandle 值为零。 隐藏窗口后将永远失去对该窗口的操作机会。


参考链接:

http://www.pstips.net/start-application-in-hidden-window.html

http://www.jb51.net/article/68186.htm