确定脚本是否隐藏运行

Knu*_*ger 4 powershell wmi powershell-2.0 powershell-3.0 powershell-4.0

我正在尝试以编程方式确定 .ps1 脚本是否正在运行。如果它正在明显运行,它应该隐藏地重新启动。如果它已经隐藏,则不采取任何操作。

我遇到的问题是一个循环,它不断地自行重新启动,因为无法确定隐藏状态。

我一直在查看 get-process cmdlet 和 GWMI Win32_process,但没有看到类似于 .visible 属性来检查状态的内容。

    If ($me -eq visible ???)
{
$Invisible = New-Object System.Diagnostics.ProcessStartInfo
$Invisible.FileName = "PowerShell.exe"
$Invisible.windowStyle ="Hidden"
$Invisible.arguments = "$myInvocation.MyCommand.Definition"
$Invisible.Verb = 'runas'
[System.Diagnostics.Process]::Start($Invisible)
}
Run Code Online (Sandbox Code Playgroud)

知道我可以 If -eq 反对什么字段吗???

小智 5

尝试使用 user32 函数“IsWindowVisible”

If (-not ([System.Management.Automation.PSTypeName]'My_User32').Type) {
Add-Type -Language CSharp -TypeDefinition @"
    using System.Runtime.InteropServices;
    public class My_User32
    { 
        [DllImport("user32.dll")]
        public static extern bool IsWindowVisible(int hwnd);
    }
"@
}

$proc = Start-Process powershell.exe -WindowStyle Hidden -ArgumentList $myInvocation.MyCommand.Definition -Verb runas -PassThru
If ([My_User32]::IsWindowVisible($proc.MainWindowHandle)) {
    #Window is visible
}
Else {
    #Window is not visible
}
Run Code Online (Sandbox Code Playgroud)

请注意,“isWindowVisible”的返回值严格来说并不是一个布尔值。它返回窗口的 WS_VISIBLE 样式位。因为隐藏的值为零而可见的值非零,所以它将作为布尔值工作。但如果你想安全一点,你可以重写If语句来检查-ne 0以确定是否可见。

另请注意 $proc.MainWindowHandle 的使用。您不能使用 $proc.Handle,因为它不是父窗口的句柄。

有关“IsWindowVisible”函数的详细信息,请参阅 Microsoft 文档:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633530%28v=vs.85%29.aspx

有关窗口样式的详细信息,请参阅 Microsoft 文档: http:
//msdn.microsoft.com/en-us/library/czada357.aspx