ユーザーにウィンドウやその他の兆候を表示せずに PowerShell スクリプトを実行するにはどうすればよいですか?
言い換えると、スクリプトはユーザーに何のサインもなしにバックグラウンドで静かに実行する必要があります。
サードパーティのコンポーネントを使用しない回答に対する追加クレジット:)
次のように実行できます(ただし、しばらくの間ウィンドウが表示されます)。
PowerShell.exe -windowstyle hidden { your script.. }
または、私が作成したヘルパーファイルを使用して、まさにそれを行うPsRun.exeというウィンドウを回避します。ソースファイルとexeファイルをダウンロードできます PowerShellでWinForm GUIを使用してスケジュールされたタスクを実行 。スケジュールされたタスクに使用します。
編集:Marcoが指摘したように、この-windowstyleパラメーターはV2でのみ使用可能です。
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/
Schedule Hidden PowerShell Tasks (インターネットアーカイブ)
スケジュールされたPowerShellでさらに楽しく (インターネットアーカイブ)
(経由 このフォーラムスレッド 。)
コマンドライン引数や別のランチャーを必要としないアプローチがあります。起動時にウィンドウが一時的に表示されるため、完全には見えません。しかし、その後すぐに消えます。それが問題ない場合、これはエクスプローラでダブルクリックするか、スタートメニューのショートカット(もちろん、スタートアップサブメニューを含む)を使用してスクリプトを起動する場合の最も簡単な方法です。そして、外部のものではなく、スクリプト自体のコードの一部であることが気に入っています。
これをスクリプトの先頭に置きます。
$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)
私はこれと同じ問題を抱えていました。 TaskのTask Schedulerに行くとわかりましたpowershell.exeスクリプトを実行すると、「」をクリックできます。ユーザーがログオンしているかどうかに関係なく実行します」であり、タスクの実行時にPowerShellウィンドウが表示されることはありません。
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
};
バックグラウンドスクリプトを実行しているときに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"に投票してください。
ワンライナーは次のとおりです。
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
これによりウィンドウを非常に短時間フラッシュすることは可能ですが、まれにしか発生しません。
元のファイルまでウィンドウレスで起動したいコンソールツールに呼び出しを渡す小さなツールを作成しました。
https://github.com/Vittel/RunHiddenConsole
コンパイル後、実行可能ファイルの名前を「<targetExecutableName> w.exe」(「w」を追加)に変更し、元の実行可能ファイルの隣に配置します。その後、e.Gに電話をかけることができます。 powershellw.exeと通常のパラメーターを使用すると、ウィンドウがポップアップしません。
誰かが作成されたプロセスが入力を待っているかどうかを確認する方法を知っているなら、あなたの解決策を含めて喜んでいます:)
最小化や非表示など、コンソールのさまざまな状態を制御する楽しいデモがあります。
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"