このスクリプトをPowerShellで実行しようとしています。以下のスクリプトを私のデスクトップにps.ps1
として保存しました。
$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}
このPowerShellスクリプトを実行するためのバッチスクリプトを作成しました
@echo off
Powershell.exe set-executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
pause
しかし、私はこのエラーを受けています:
-ExecutionPolicy
パラメータが必要です。
Powershell.exe -executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
それ以外の場合、PowerShellは引数を実行する行と見なし、Set-ExecutionPolicy
は - コマンドレットですが、-File
パラメータはありません。
PowerShellスクリプトをバッチファイルから呼び出す理由とその方法の両方について説明します 私のブログ投稿 。
これは基本的にあなたが探しているものです:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"
PowerShellスクリプトを管理者として実行する必要がある場合は、これを使用します。
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"
ただし、PowerShellスクリプトへのパス全体をハードコーディングするのではなく、ブログ投稿で説明しているように、バッチファイルとPowerShellスクリプトファイルを同じディレクトリに配置することをお勧めします。
PowerShellを管理者として呼び出すバッチファイルを実行する場合は、このように実行するほうが賢明です。
powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"
Bypass
...を使用することをお勧めします。
完全修飾パスなしで現在のディレクトリから実行したい場合は、次のようにします。
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
いくつかのスクリプトを実行したい場合は、Set-executionpolicy -ExecutionPolicy Unrestricted
を使用してからSet-executionpolicy -ExecutionPolicy Default
でリセットすることができます。
実行ポリシーは実行を開始したときにのみチェックされるので(またはそう思われるため)、バックグラウンドでジョブを実行してすぐに実行ポリシーをリセットできます。
# Check current setting
Get-ExecutionPolicy
# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com | tee ping__google.com.txt }
# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es
Psスクリプトをバッチから実行するもう1つの簡単な方法は、ECHO文字とリダイレクト文字(>と>>)の間に単純に組み込むことです。次に例を示します。
@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"
最後の行は作成された一時ファイルを削除します。
PowerShellログインスクリプトが2012年のサーバーで5分後に実行されている場合(私の場合と同様)、サーバーにGPO設定があります。ログインスクリプトを実行する前に5分の遅延を残して下さい。
小さなサンプルtest.cmd
<# :
@echo off
powershell /nologo /noprofile /command ^
"&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...