Bagaimana cara menjalankan skrip PowerShell tanpa menampilkan jendela?


127

Bagaimana mungkin menjalankan skrip PowerShell tanpa menampilkan jendela atau tanda lain apa pun kepada pengguna?

Dengan kata lain, skrip harus berjalan secara diam-diam di latar belakang tanpa tanda apa pun kepada pengguna.

Kredit ekstra untuk jawaban yang tidak menggunakan komponen pihak ketiga :)


Lihat pertanyaan ini jika Anda tertarik untuk belajar: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Thomas Bratt

Solusi ini juga berfungsi untuk Penjadwal Tugas: stackoverflow.com/a/51007810/571591
Hilydrow

Jawaban:


128

Anda dapat menjalankannya seperti ini (tetapi ini menunjukkan jendela sebentar):

PowerShell.exe -windowstyle hidden { your script.. }

Atau Anda menggunakan file pembantu yang saya buat untuk menghindari jendela bernama PsRun.exe yang melakukan hal itu. Anda dapat mengunduh file sumber dan exe Jalankan tugas terjadwal dengan WinForm GUI di PowerShell . Saya menggunakannya untuk tugas terjadwal.

Diedit: seperti yang dicatat Marco, parameter -windowstyle ini hanya tersedia untuk V2.


6
Saya mengkompilasi PsRun, namun, jika saya menambahkannya ke tugas yang dijadwalkan, itu juga
mem-

2
Sama di sini, juga tidak berfungsi karena jendela masih muncul untuk menjalankan skrip. Ini keluar dengan cepat tetapi kami mencoba menjalankan ini di latar belakang tanpa gangguan.
Nathan McKaskle

1
Ya, itulah mengapa ada "tetapi ini menunjukkan jendela sebentar" dalam respons.
stej

21
@ThomasBratt Untuk tugas terjadwal, saya menemukan skrip PowerShell berjalan diam-diam tanpa -WindowStyle Hiddenjika tugas disetel ke Run whether user is logged on or nottab Umum di bawah bagian "Opsi Keamanan".
adam

1
Menggunakan Akun Pengguna ke SISTEM juga menghindari jendela yang ditampilkan.
Jon Eldridge

27

Saya mengalami masalah yang sama. Saya menemukan jika Anda pergi ke Tugas di Penjadwal Tugas yang menjalankan skrip PowerShell.exe , Anda dapat mengklik " Jalankan apakah pengguna masuk atau tidak " dan itu tidak akan pernah menampilkan jendela PowerShell saat tugas berjalan.


3
Solusi terbaik tanpa bergantung pada ekstensi pihak ketiga, dapat dijalankan, atau skrip pembungkus.
membalikkan

1
Perhatikan bahwa opsi ini mengharuskan pengguna memiliki hak istimewa "Masuk sebagai Pekerjaan Batch"
gb96

Solusi ini membuat skrip saya tidak berjalan dengan baik .
Martin Argerami

18

Anda dapat menggunakan Ekstensi Komunitas PowerShell dan melakukan ini:

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

Anda juga dapat melakukan ini dengan VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(Melalui utas forum ini .)


Apakah ada paclage NuGet untuk ini sehingga saya dapat menjalankannya dari Visual Studio?
Piotr Kula

13

Berikut adalah pendekatan yang tidak memerlukan argumen baris perintah atau peluncur terpisah. Ini tidak sepenuhnya tidak terlihat karena sebuah jendela muncul sebentar saat startup. Tapi kemudian dengan cepat menghilang. Jika tidak apa-apa, menurut saya, ini adalah pendekatan termudah jika Anda ingin meluncurkan skrip dengan mengklik dua kali di explorer, atau melalui pintasan menu Start (termasuk, tentu saja submenu Startup). Dan saya suka itu adalah bagian dari kode skrip itu sendiri, bukan sesuatu yang eksternal.

Letakkan ini di depan skrip Anda:

$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)

10

Ini satu baris:

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

Meskipun ini mungkin untuk mem-flash jendela dengan sangat singkat, itu seharusnya jarang terjadi.


Dalam kebanyakan kasus, menjalankan Powershell.exe dalam konteks pengguna yang masuk akan menampilkan jendela penuh atau berkedip sebentar jika Anda menggunakan -windowstyle hidden. Untuk menghapus jendela sepenuhnya, Anda dapat melakukan salah satu dari dua hal: 1: Jalankan dalam konteks pengguna yang berbeda seperti akun admin (tidak akan menampilkan jendela apa pun untuk pengguna yang masuk). Atau 2: Gunakan vbscript dengan objshell.run dengan bendera jendela tersembunyi untuk menjalankan cmd.exe / c powershel.exe -file c: \ script.ps1. Ketika PowerShell dipanggil dari cmd, itu akan berjalan di jendela cmd yang sudah ada yang telah disembunyikan oleh wscript.exe // b / nologo c: \ launcher.vbs.
Iconiu

wow, tiba-tiba. Saya bahkan tidak memperhatikan jawaban Anda pada awalnya. Saya menjawab dengan naskah yang sangat mirip. Sangat menyenangkan melihat orang berpengetahuan yang memberikan jawaban nyata.
Gosha

Ini harus menjadi jawaban yang diterima, ini adalah satu-satunya metode yang tampaknya berfungsi dalam setiap situasi (termasuk di dalam penjadwal tugas, yang merupakan masalah saya).
Martin Argerami

6

Saya mengalami masalah ini saat menjalankan dari c #, pada Windows 7, layanan "Deteksi Layanan Interaktif" muncul saat menjalankan jendela PowerShell tersembunyi sebagai akun SISTEM.

Menggunakan parameter "CreateNoWindow" mencegah layanan ISD memunculkan peringatannya.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};

5

Saya pikir cara terbaik untuk menyembunyikan layar konsol PowerShell saat Anda menjalankan skrip latar belakang adalah kode ini ( jawaban " Bluecakes ").

Saya menambahkan kode ini di awal semua skrip PowerShell saya yang harus saya jalankan di latar belakang.

# .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

Jika jawaban ini membantu Anda, silakan pilih "Bluecakes" dalam jawabannya di posting ini.


Bagi saya konsol tersebut masih menampilkan sekitar satu detik.
thdoan

3

ps1 disembunyikan dari Penjadwal Tugas dan pintasan juga

    mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -ExecutionPolicy Bypass & 'C:\PATH\NAME.ps1'"", 0:close")

2

Saya telah membuat alat kecil yang meneruskan panggilan ke alat konsol apa pun yang ingin Anda mulai tanpa jendela hingga ke file asli:

https://github.com/Vittel/RunHiddenConsole

Setelah kompilasi, cukup ganti nama file yang dapat dieksekusi menjadi "<targetExecutableName> w.exe" (tambahkan "w"), dan letakkan di sebelah file yang dapat dieksekusi asli. Anda kemudian dapat memanggil eG powershellw.exe dengan parameter biasa dan itu tidak akan memunculkan jendela.

Jika seseorang memiliki ide bagaimana memeriksa apakah proses yang dibuat sedang menunggu masukan, saya akan dengan senang hati menyertakan solusi Anda :)


1
Ini adalah jawaban terbaik jika Anda ingin menjalankan script PowerShell menggunakan MessageBoxtanpa setiap kilatan jendela pada startup (yang membutuhkan EXE disusun sebagai Winexe, bukan aplikasi konsol, dan membutuhkan Task Scheduler harus ditetapkan untuk "Run hanya ketika pengguna login pada "jadi dialog ditampilkan di sesi desktop saat ini.) Terima kasih telah menerapkan ini, powershellw.exe telah ada di daftar keinginan saya selama bertahun-tahun!
Carl Walsh

PS: Saya telah menyertakan solusi untuk "menunggu masukan" beberapa waktu yang lalu (serta beberapa perbaikan bug)!
Chris

@CarlWalsh saya berasumsi bahwa maksud Anda itu bukan aplikasi konsol, tetapi aplikasi bentuk menang, yang benar. hanya saja tidak termasuk jendela apa pun. tetapi jenis proyek harus ditentukan dalam file csproj dan Anda tidak perlu menetapkan jenis keluaran tertentu setelah membukanya dengan visual studio
Chris

2

Berikut adalah solusi yang berfungsi di windows 10 yang tidak menyertakan komponen pihak ketiga. Ia bekerja dengan membungkus skrip PowerShell ke dalam VBScript.

Langkah 1: kita perlu mengubah beberapa fitur windows agar VBScript dapat menjalankan PowerShell dan membuka file .ps1 dengan PowerShell secara default.

-pergi untuk menjalankan dan ketik "regedit". Klik ok dan kemudian biarkan berjalan.

-paste jalur ini "HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell" dan tekan enter.

-sekarang buka entri di sebelah kanan dan ubah nilainya menjadi 0.

-Buka PowerShell sebagai administrator dan ketik "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned", tekan enter dan konfirmasi perubahan dengan "y" lalu enter.

Langkah 2: Sekarang kita dapat mulai membungkus skrip kita.

-simpan skrip Powershell Anda sebagai file .ps1.

-buat dokumen teks baru dan tempelkan skrip ini.

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

-sekarang ubah jalur file ke lokasi skrip .ps1 Anda dan simpan dokumen teks.

-Sekarang klik kanan pada file dan pergi untuk mengganti nama. Kemudian ubah ekstensi nama file menjadi .vbs dan tekan enter lalu klik ok.

SELESAI! Jika sekarang Anda membuka .vbs, Anda seharusnya tidak melihat jendela konsol saat skrip Anda berjalan di latar belakang.

pastikan untuk memberi suara positif jika ini berhasil untuk Anda!


1

Berikut adalah demo menyenangkan mengontrol berbagai status konsol, termasuk meminimalkan dan tersembunyi.

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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.