เป็นไปได้อย่างไรที่จะเรียกใช้สคริปต์PowerShellโดยไม่แสดงหน้าต่างหรือเครื่องหมายอื่นใดให้กับผู้ใช้
กล่าวอีกนัยหนึ่งสคริปต์ควรทำงานอย่างเงียบ ๆ ในพื้นหลังโดยไม่มีสัญญาณใด ๆ กับผู้ใช้
เครดิตเพิ่มเติมสำหรับคำตอบที่ไม่ใช้ส่วนประกอบของบุคคลที่สาม :)
เป็นไปได้อย่างไรที่จะเรียกใช้สคริปต์PowerShellโดยไม่แสดงหน้าต่างหรือเครื่องหมายอื่นใดให้กับผู้ใช้
กล่าวอีกนัยหนึ่งสคริปต์ควรทำงานอย่างเงียบ ๆ ในพื้นหลังโดยไม่มีสัญญาณใด ๆ กับผู้ใช้
เครดิตเพิ่มเติมสำหรับคำตอบที่ไม่ใช้ส่วนประกอบของบุคคลที่สาม :)
คำตอบ:
คุณสามารถเรียกใช้เช่นนี้ (แต่จะแสดงหน้าต่างชั่วขณะหนึ่ง):
PowerShell.exe -windowstyle hidden { your script.. }
หรือคุณใช้ไฟล์ตัวช่วยที่ฉันสร้างขึ้นเพื่อหลีกเลี่ยงหน้าต่างที่เรียกว่า PsRun.exe ที่ทำอย่างนั้น คุณสามารถดาวน์โหลดไฟล์ซอร์สและไฟล์ exe เรียกใช้งานตามกำหนดเวลาด้วย WinForm GUI ใน PowerShellPowerShell ฉันใช้สำหรับงานตามกำหนดเวลา
แก้ไข: ตามที่ Marco ตั้งข้อสังเกตพารามิเตอร์ -windowstyle นี้มีให้สำหรับ V2 เท่านั้น
-WindowStyle Hidden
ที่งานนั้นถูกตั้งค่าเป็นRun whether user is logged on or not
บนแท็บทั่วไปในส่วน "ตัวเลือกความปลอดภัย"
ฉันมีปัญหาเดียวกันนี้ ฉันพบว่าถ้าคุณไปที่TaskในTask Schedulerที่เรียกใช้สคริปต์powershell.exeคุณสามารถคลิก " Run ไม่ว่าผู้ใช้จะเข้าสู่ระบบหรือไม่ " และจะไม่แสดงหน้าต่าง powershell เมื่องานทำงาน
คุณสามารถใช้PowerShell Community Extensionsและทำสิ่งนี้:
start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden
คุณสามารถทำได้ด้วย VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/
กำหนดเวลางาน PowerShell ที่ซ่อนอยู่ (Internet Archive)
สนุกยิ่งขึ้นด้วย PowerShell ตามกำหนดเวลา (Internet Archive)
(ผ่านทางฟอรัมนี้)
นี่คือแนวทางที่ไม่ต้องใช้ args บรรทัดคำสั่งหรือตัวเรียกใช้งานแยกต่างหาก ไม่สามารถมองเห็นได้อย่างสมบูรณ์เนื่องจากหน้าต่างแสดงขึ้นชั่วขณะเมื่อเริ่มต้น แต่จากนั้นก็หายไปอย่างรวดเร็ว ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดหากคุณต้องการเปิดสคริปต์ของคุณโดยการดับเบิลคลิกใน explorer หรือผ่านทางลัดเมนูเริ่ม (รวมถึงเมนูย่อยของ Startup) และฉันชอบที่มันเป็นส่วนหนึ่งของโค้ดของสคริปต์ไม่ใช่สิ่งภายนอก
วางไว้ที่ด้านหน้าสคริปต์ของคุณ:
$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)
นี่คือซับเดียว:
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
แม้ว่าจะเป็นไปได้ที่สิ่งนี้จะกะพริบหน้าต่างสั้น ๆ แต่ก็น่าจะเป็นเหตุการณ์ที่หายาก
ฉันประสบปัญหานี้เมื่อเรียกใช้จาก c # บน Windows 7 บริการ "Interactive Services Detection" ปรากฏขึ้นเมื่อเรียกใช้หน้าต่าง powershell ที่ซ่อนอยู่ในบัญชี SYSTEM
การใช้พารามิเตอร์ "CreateNoWindow" ป้องกันไม่ให้บริการ ISD ปรากฏคำเตือน
process.StartInfo = new ProcessStartInfo("powershell.exe",
String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
WorkingDirectory = executablePath,
UseShellExecute = false,
CreateNoWindow = true
};
ฉันคิดว่าวิธีที่ดีที่สุดในการซ่อนหน้าจอคอนโซลของ PowerShell เมื่อคุณเรียกใช้สคริปต์พื้นหลังคือรหัสนี้ ( คำตอบ " Bluecakes ")
ฉันเพิ่มรหัสนี้ในตอนต้นของสคริปต์ PowerShell ทั้งหมดของฉันที่ฉันต้องใช้ในพื้นหลัง
# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
$consolePtr = [Console.Window]::GetConsoleWindow()
#0 hide
[Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
หากคำตอบนี้ช่วยคุณได้โปรดให้คะแนน"Bluecakes" ในคำตอบของเขาในโพสต์นี้
ps1 ซ่อนจาก Task Scheduler และทางลัดด้วย
mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -ExecutionPolicy Bypass & 'C:\PATH\NAME.ps1'"", 0:close")
ฉันได้สร้างเครื่องมือขนาดเล็กส่งการโทรไปยังเครื่องมือคอนโซลใด ๆ ที่คุณต้องการเริ่มต้นแบบไม่มีหน้าต่างไปยังไฟล์ต้นฉบับ:
https://github.com/Vittel/RunHiddenConsole
หลังจากคอมไพล์แล้วให้เปลี่ยนชื่อไฟล์ปฏิบัติการเป็น "<targetExecutableName> w.exe" (ต่อท้าย "w") และวางไว้ถัดจากไฟล์ปฏิบัติการดั้งเดิม จากนั้นคุณสามารถเรียกใช้ eG powershellw.exe ด้วยพารามิเตอร์ปกติและจะไม่ปรากฏหน้าต่าง
หากมีใครทราบวิธีตรวจสอบว่ากระบวนการที่สร้างขึ้นกำลังรอการป้อนข้อมูลอยู่หรือไม่ยินดีที่จะรวมโซลูชันของคุณ :)
MessageBox
โดยไม่ต้องใด ๆแฟลชของหน้าต่างในการเริ่มต้น (ต้อง EXE รวบรวมเป็น Winexe, ไม่ได้เป็น app คอนโซลและต้องกำหนดเวลางานจะได้รับการตั้งค่าเป็น "เรียกใช้เฉพาะเมื่อผู้ใช้จะเข้าสู่ระบบ บน "เพื่อให้กล่องโต้ตอบแสดงในเซสชันเดสก์ท็อปปัจจุบัน) ขอบคุณสำหรับการใช้งานนี้ powershellw.exe อยู่ในรายการสิ่งที่อยากได้ของฉันมาหลายปีแล้ว!
นี่คือโซลูชันการทำงานใน windows 10 ที่ไม่มีส่วนประกอบของบุคคลที่สาม ทำงานโดยการรวมสคริปต์ PowerShell ลงใน VBScript
ขั้นตอนที่ 1: เราจำเป็นต้องเปลี่ยนคุณสมบัติบางอย่างของ windows เพื่อให้ VBScript เรียกใช้ PowerShell และเปิดไฟล์. ps1 ด้วย PowerShell ตามค่าเริ่มต้น
-go เพื่อเรียกใช้และพิมพ์ "regedit" คลิกที่ตกลงจากนั้นอนุญาตให้ทำงาน
- วางเส้นทางนี้ "HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell" แล้วกด Enter
- ตอนนี้เปิดรายการทางด้านขวาและเปลี่ยนค่าเป็น 0
- เปิด PowerShell ในฐานะผู้ดูแลระบบและพิมพ์ "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned" กด Enter และยืนยันการเปลี่ยนแปลงด้วย "y" จากนั้นป้อน
ขั้นตอนที่ 2: ตอนนี้เราสามารถเริ่มตัดสคริปต์ของเราได้แล้ว
- บันทึกสคริปต์ Powershell ของคุณเป็นไฟล์. ps1
- สร้างเอกสารข้อความใหม่และวางสคริปต์นี้
Dim objShell,objFSO,objFile
Set objShell=CreateObject("WScript.Shell")
Set objFSO=CreateObject("Scripting.FileSystemObject")
'enter the path for your PowerShell Script
strPath="c:\your script path\script.ps1"
'verify file exists
If objFSO.FileExists(strPath) Then
'return short path name
set objFile=objFSO.GetFile(strPath)
strCMD="powershell -nologo -command " & Chr(34) & "&{" &_
objFile.ShortPath & "}" & Chr(34)
'Uncomment next line for debugging
'WScript.Echo strCMD
'use 0 to hide window
objShell.Run strCMD,0
Else
'Display error message
WScript.Echo "Failed to find " & strPath
WScript.Quit
End If
- เปลี่ยนเส้นทางไฟล์ไปยังตำแหน่งของสคริปต์. ps1 ของคุณและบันทึกเอกสารข้อความ
- ตอนนี้คลิกขวาที่ไฟล์แล้วไปที่เปลี่ยนชื่อ จากนั้นเปลี่ยนนามสกุลไฟล์เป็น. vbs แล้วกด Enter จากนั้นคลิกตกลง
ทำ! หากตอนนี้คุณเปิด. vbs คุณจะไม่เห็นหน้าต่างคอนโซลในขณะที่สคริปต์ของคุณกำลังทำงานอยู่เบื้องหลัง
อย่าลืมโหวตเพิ่มถ้าสิ่งนี้เหมาะกับคุณ!
นี่คือการสาธิตสนุก ๆ ในการควบคุมสถานะต่างๆของคอนโซลรวมถึงย่อและซ่อน
Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@
$ConsoleMode = @{
HIDDEN = 0;
NORMAL = 1;
MINIMIZED = 2;
MAXIMIZED = 3;
SHOW = 5
RESTORE = 9
}
$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"