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