啟動PowerShell時隱藏自己的視窗
假如我在計劃任務中定時通過Powershell.exe來執行一個指令檔,我想隱藏這個視窗,此時我們可以考慮使用PowerShell.exe的選項參數:
複製代碼 代碼如下:
-WindowStyle
將視窗樣式設定為 Normal、Minimized、Maximized 或 Hidden。
複製代碼 代碼如下:
PowerShell.exe -WindowStyle Hidden -file '您的指令碼.ps1'
在PowerShell啟動其它進程時隱藏視窗
這個需求也能理解:
複製代碼 代碼如下:
Start-Process notepad.exe -WindowStyle Hidden
上面的指令碼會啟動一個隱藏的記事本程式。
使用PowerShell隱藏其它進程的視窗
這是一個奇葩的需求,但是使用者也有一番自己的理由:
@scl95tx如是說:
我已經實現了一個24小時不間斷的Powershell指令碼,有很多資料通過write-host命令輸出到控制台(需要隨時查看這些資料,確保server運行正常,所以後台運行我先不考慮),如果(由於操作失誤)誤點擊控制台視窗,那麼指令碼就會停止執行,是否有辦法把控制台隱藏起來,如果我想查看指令碼的運行情況,再把控制台調出來:也就是有隨時隱藏和調出來控制台的辦法嗎?
這需求合情合理啊,接下來我們解決這個問題:
複製代碼 代碼如下:
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
可是當我嘗試調出隱藏的視窗時,執行返回false。
複製代碼 代碼如下:
PS> Get-Process notepad | Set-ProcessWindowStyle -WindowStyle Show
False
對此我深表遺憾,當視窗被隱藏後,進程的控制代碼值MainWindowHandle變成了0,0代表什嗎?
MSDN如是說:如果關聯進程沒有主視窗,則 MainWindowHandle 值為零。
結論:不要隱藏進程的視窗,否則你將永遠失去了操作該視窗的機會。