ウィンドウを表示せずにPowerShellスクリプトを実行する方法は?


127

ウィンドウやその他のサインをユーザーに表示せずにPowerShellスクリプトを実行するにはどうすればよいですか?

言い換えると、スクリプトは、ユーザーに署名することなく、バックグラウンドで静かに実行する必要があります。

サードパーティのコンポーネントを使用しない回答に対する追加のクレジット:)


学習に興味がある場合は、この質問を確認してください: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Thomas Bratt

このソリューションはタスクスケジューラでも機能します:stackoverflow.com/a/51007810/571591
Hilydrow

回答:


128

次のように実行することもできます(ただし、しばらくの間ウィンドウが表示されます)。

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

または、私が作成したヘルパーファイルを使用して、PsRun.exeと呼ばれるウィンドウを回避します。ソースとexeファイルをダウンロードできます。PowerShellのWinForm GUIでスケジュールされたタスクを実行します。スケジュールされたタスクに使用します。

編集:マルコが指摘したように、この-windowstyleパラメータはV2でのみ使用できます。


6
PsRunをコンパイルしましたが、スケジュールされたタスクに追加すると、ウィンドウが点滅します...
Ciantic

2
ここでも同じですが、ウィンドウがポップアップしてスクリプトを実行するため、機能しません。すぐに終了しますが、中断することなくバックグラウンドで実行しようとしています。
Nathan McKaskle

1
はい、それが応答に「これはしばらくの間ウィンドウを表示します」がある理由です。
stej 2016

21
@ThomasBrattスケジュールされたタスクの-WindowStyle Hidden場合、Run whether user is logged on or not[セキュリティオプション]セクションの[全般]タブでタスクが設定されていないと、PowerShellスクリプトがサイレントに実行されることがわかりました。
adam

1
SYSTEMにユーザーアカウントを使用すると、ウィンドウが表示されなくなります。
Jon Eldridge

27

私も同じ問題を抱えていました。powershell.exeスクリプトを実行しているタスクスケジューラタスクに移動すると、[ ユーザーがログオンしているかどうかにかかわらず実行する ]をクリックでき、タスクの実行時にpowershellウィンドウが表示されないことがわかりました。


3
サードパーティの拡張機能、実行可能ファイル、またはラッパースクリプトに依存しない最適なソリューション。
反転

1
このオプションでは、ユーザーが「バッチジョブとしてログオン」権限を持っている必要があることに注意してください
gb96

この解決策により、スクリプトが正しく実行されなくなります
Martin Argerami

18

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/

このフォーラムのスレッド経由。)


Visual Studioから実行できるように、このためのNuGetパッケージがありますか?
Piotr Kula

13

コマンドライン引数や個別のランチャーを必要としないアプローチを次に示します。起動時にウィンドウが一時的に表示されるため、完全に非表示になるわけではありません。しかし、それはすぐに消えます。それが問題ない場合、エクスプローラでダブルクリックするか、[スタート]メニューのショートカット(もちろん、[スタートアップ]サブメニューを含む)を使用してスクリプトを起動する場合は、これが最も簡単な方法だと思います。また、スクリプト自体のコードの一部であり、外部的なものではないことも気に入っています。

これをスクリプトの前に置きます。

$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

ここにワンライナーがあります:

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

これによりウィンドウが短時間点滅する可能性がありますが、これはまれなケースです。


ほとんどの場合、ログオンしたユーザーのコンテキストでPowershell.exeを実行すると、ウィンドウ全体が表示されるか、-windowstyle hiddenを使用している場合は一時的に点滅します。ウィンドウを完全に削除するには、次の2つのいずれかを実行します。1:管理者アカウントなどの別のユーザーのコンテキストで実行します(ログオンしているユーザーにウィンドウを表示しません)。または2:objshell.runでvbscriptを使用し、ウィンドウフラグを非表示にして、cmd.exe / c powershel.exe -file c:\ script.ps1を起動します。PowerShellがcmdから呼び出されると、wscript.exe // b / nologo c:\ launcher.vbsによって既に非表示になっている既存のcmdウィンドウで実行されます。
Iconiu

うわー、突然。最初はあなたの答えにも気づきませんでした。私は非常によく似たスクリプトで答えました。本当の答えを出す知識豊富な人に会うのは素晴らしいことです。
Gosha

これは受け入れられる答えである必要があります。これは、すべての状況で機能するように見える1つの方法です(タスクスケジューラ内を含むが、これは私の問題でした)。
Martin Argerami

6

Windows 7でc#から実行すると、この問題が発生しました。非表示のPowerShellウィンドウをSYSTEMアカウントとして実行すると、「インタラクティブサービス検出」サービスがポップアップしていました。

「CreateNoWindow」パラメーターを使用すると、ISDサービスが警告をポップアップしなくなりました。

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

5

バックグラウンドスクリプトを実行しているときに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」に投票してください


私にとって、コンソールは約1秒間表示されます。
thdoan

3

ps1はタスクスケジューラとショートカットからも非表示

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

2

ウィンドウレスで起動したいコンソールツールの呼び出しを元のファイルに渡す小さなツールを作成しました。

https://github.com/Vittel/RunHiddenConsole

コンパイル後、実行可能ファイルの名前を "<targetExecutableName> w.exe"( "w"を追加)に変更し、元の実行可能ファイルの横に置きます。その後、通常のパラメーターを使用してeG powershellw.exeを呼び出すことができます。ウィンドウがポップアップすることはありません。

誰かが作成されたプロセスが入力を待っているかどうかを確認する方法を知っているなら、あなたの解決策を含めて幸せです:)


1
あなたが使用してPowerShellスクリプトを実行したい場合、これが最良の答えであるMessageBoxことなく、任意のユーザーがログインしている場合にのみ、ファイル名を指定して実行」に設定するWinexe、ないコンソールアプリケーション、および必要なタスクスケジューラとしてコンパイルEXEを必要とする(起動時にウィンドウのフラッシュ現在のデスクトップセッションにダイアログが表示されます。)これを実装してくれてありがとう、powershellw.exeは何年もの間私の希望リストにありました!
カールウォルシュ

PS:私は少し前に「入力を待つ」ためのソリューション(およびいくつかのバグ修正)を含めました!
Chris

@CarlWalsh私はあなたがそれがコンソールアプリではなく、代わりに勝利フォームアプリであることを意味すると思います、それは正しいです。ウィンドウは含まれていません。ただし、プロジェクトタイプはcsprojファイルで定義する必要があり、Visual Studioで開いた後に特定の出力タイプを設定する必要はありません
Chris

2

以下は、サードパーティのコンポーネントを含まないWindows 10の実用的なソリューションです。PowerShellスクリプトをVBScriptにラップすることで機能します。

手順1:VBScriptがPowerShellを実行し、デフォルトでPowerShellで.ps1ファイルを開くことができるように、いくつかのWindows機能を変更する必要があります。

-goを実行して「regedit」と入力します。[OK]をクリックして、実行を許可します。

-このパス「HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell」を貼り付け、Enterキーを押します。

-右側のエントリを開き、値を0に変更します。

-管理者としてPowerShellを開き、「Set-ExecutionPolicy -ExecutionPolicy RemoteSigned」と入力してEnterキーを押し、「y」で変更を確認してからEnterキーを押します。

ステップ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キーを押し、[OK]をクリックします。

できた!.vbsを開くと、スクリプトがバックグラウンドで実行されている間、コンソールウィンドウは表示されません。

これで問題が解決した場合は、必ず賛成票を投じてください。


1

これは、最小化や非表示など、コンソールのさまざまな状態を制御する楽しいデモです。

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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.