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
| 归档时间: |
|
| 查看次数: |
5391 次 |
| 最近记录: |