ウィンドウやその他のサインをユーザーに表示せずにPowerShellスクリプトを実行するにはどうすればよいですか?
言い換えると、スクリプトは、ユーザーに署名することなく、バックグラウンドで静かに実行する必要があります。
サードパーティのコンポーネントを使用しない回答に対する追加のクレジット:)
ウィンドウやその他のサインをユーザーに表示せずにPowerShellスクリプトを実行するにはどうすればよいですか?
言い換えると、スクリプトは、ユーザーに署名することなく、バックグラウンドで静かに実行する必要があります。
サードパーティのコンポーネントを使用しない回答に対する追加のクレジット:)
回答:
次のように実行することもできます(ただし、しばらくの間ウィンドウが表示されます)。
PowerShell.exe -windowstyle hidden { your script.. }
または、私が作成したヘルパーファイルを使用して、PsRun.exeと呼ばれるウィンドウを回避します。ソースとexeファイルをダウンロードできます。PowerShellのWinForm GUIでスケジュールされたタスクを実行します。スケジュールされたタスクに使用します。
編集:マルコが指摘したように、この-windowstyleパラメータはV2でのみ使用できます。
-WindowStyle Hidden
場合、Run whether user is logged on or not
[セキュリティオプション]セクションの[全般]タブでタスクが設定されていないと、PowerShellスクリプトがサイレントに実行されることがわかりました。
私も同じ問題を抱えていました。powershell.exeスクリプトを実行しているタスクスケジューラのタスクに移動すると、[ ユーザーがログオンしているかどうかにかかわらず実行する ]をクリックでき、タスクの実行時に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タスクのスケジュール(インターネットアーカイブ)
スケジュールされた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)
ここにワンライナーがあります:
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
これによりウィンドウが短時間点滅する可能性がありますが、これはまれなケースです。
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
};
バックグラウンドスクリプトを実行しているときに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」に投票してください。
ウィンドウレスで起動したいコンソールツールの呼び出しを元のファイルに渡す小さなツールを作成しました。
https://github.com/Vittel/RunHiddenConsole
コンパイル後、実行可能ファイルの名前を "<targetExecutableName> w.exe"( "w"を追加)に変更し、元の実行可能ファイルの横に置きます。その後、通常のパラメーターを使用してeG powershellw.exeを呼び出すことができます。ウィンドウがポップアップすることはありません。
誰かが作成されたプロセスが入力を待っているかどうかを確認する方法を知っているなら、あなたの解決策を含めて幸せです:)
MessageBox
ことなく、任意のユーザーがログインしている場合にのみ、ファイル名を指定して実行」に設定するWinexe、ないコンソールアプリケーション、および必要なタスクスケジューラとしてコンパイルEXEを必要とする(起動時にウィンドウのフラッシュ現在のデスクトップセッションにダイアログが表示されます。)これを実装してくれてありがとう、powershellw.exeは何年もの間私の希望リストにありました!
以下は、サードパーティのコンポーネントを含まない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を開くと、スクリプトがバックグラウンドで実行されている間、コンソールウィンドウは表示されません。
これで問題が解決した場合は、必ず賛成票を投じてください。
これは、最小化や非表示など、コンソールのさまざまな状態を制御する楽しいデモです。
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"