PowerShell启动进程时隐藏窗口

方法一


 

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

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隐藏其它进程的窗口

代码:

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注