web-dev-qa-db-ja.com

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

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

言い換えると、スクリプトはユーザーに何のサインもなしにバックグラウンドで静かに実行する必要があります。

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

102
Thomas Bratt

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

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

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

編集:Marcoが指摘したように、この-windowstyleパラメーターはV2でのみ使用可能です。

108
stej

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/

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

17
ax.

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

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

$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)
13
Andy Lowry

私はこれと同じ問題を抱えていました。 TaskTask Schedulerに行くとわかりましたpowershell.exeスクリプトを実行すると、「」をクリックできます。ユーザーがログオンしているかどうかに関係なく実行します」であり、タスクの実行時にPowerShellウィンドウが表示されることはありません。

9
Yusha

Windows 7でc#から実行しているときにこの問題が発生していました。SYSTEMアカウントとして非表示のPowerShellウィンドウを実行すると、「Interactive Services Detection」サービスがポップアップしました。

「CreateNoWindow」パラメータを使用すると、ISDサービスが警告を表示するのを防ぎました。

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

バックグラウンドスクリプトを実行しているときにPowerShellのコンソール画面を非表示にする最善の方法は、 this code ( " 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"に投票してください。

4
gavraham

ワンライナーは次のとおりです。

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

これによりウィンドウを非常に短時間フラッシュすることは可能ですが、まれにしか発生しません。

4
Adam Taylor

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

https://github.com/Vittel/RunHiddenConsole

コンパイル後、実行可能ファイルの名前を「<targetExecutableName> w.exe」(「w」を追加)に変更し、元の実行可能ファイルの隣に配置します。その後、e.Gに電話をかけることができます。 powershellw.exeと通常のパラメーターを使用すると、ウィンドウがポップアップしません。

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

1
Chris

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

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"
0
js2010