PHPからPowerShellスクリプトを実行しようとしていますが、動作しないようです。
スクリプト 'newEvent.ps1'は、Exchangeサーバー上にイベントを作成します。
$psPath = "powershell.exe";
$psDIR = "C:\\wamp\\www\\ant\\assets\\ps\\";
$psScript = "newEvent.ps1";
$runScript = $psDIR. $psScript;
$runCMD = $psPath." ".$runScript." 2>&1";
echo "\$psPath $psPath <br>";
echo "\$psDIR $psDIR <br>";
echo "\$psScript $psScript <br>";
echo "\$runScript $runScript <br>";
echo "\$runCMD $runCMD <br>";
exec( $runCMD,$out,$ret);
echo "<pre>";
print_r($out);
print_r($ret);
echo "</pre>";
それは出力します:
$psPath powershell.exe
$psDIR C:\wamp\www\ant\assets\ps\
$psScript newEvent.ps1
$runScript C:\wamp\www\ant\assets\ps\newEvent.ps1
$runCMD powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1 2>&1
Array
(
[0] => File C:\wamp\www\ant\assets\ps\newEvent.ps1 cannot be loaded because the execut
[1] => ion of scripts is disabled on this system. Please see "get-help about_signing"
[2] => for more details.
[3] => At line:1 char:39
[4] => + C:\wamp\www\ant\assets\ps\newEvent.ps1 <<<<
[5] => + CategoryInfo : NotSpecified: (:) [], PSSecurityException
[6] => + FullyQualifiedErrorId : RuntimeException
[7] =>
)
powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1
コマンドラインでは、正常に動作します。
これはこのようなことを試みるのは初めてです。私は走ったSet-ExecutionPolicy RemoteSigned -Scope LocalMachine
でも同じエラーが発生します。実際、私はSet-ExecutionPolicy unristricted
、しかしそれはまだ同じです。
コマンドは単一引用符で囲まれているようです。それらを削除すると、コマンドは実行されるはずです。
Shell_exec
は、実行したコマンドからの出力を返します。さらに診断するには、出力を変数に格納してから出力します。
$output= Shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '</pre>' );
スクリプトの実行を必ず有効にしてください。この機能はデフォルトでオフになっています。 PowerShellスクリプトを実行する各マシンでスクリプトの実行を有効にする必要があります。詳細については、about help_signing
を実行してください。
マイクロソフトは、Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
を実行することをお勧めします。これにより、マシンのすべてのユーザーアカウントでローカルスクリプトを問題なく実行できますが、インターネットからダウンロードしたスクリプトを実行するには確認が必要です。これは、管理プロンプトで実行する必要があります。 64ビットのオペレーティングシステムを実行している場合は、64ビットと32ビットの両方のシェルからこれを行う必要があります。
使用する "-executionPolicy Unrestricted
"とコマンド" powershell.exe
"。したがって、コマンドは次のようになります。
powershell.exe -executionPolicy Unrestricted
それならきっとうまくいきます。
これを別のウェブサイトで見つけて、私はそれを渡すと思いました:
MicrosoftのWindows PowerShellの標準出力をキャプチャするために、Windows API(リダイレクトされた入力と出力を持つ子プロセスの作成)を使用するプログラムをデバッグしていました。
PowerShellに渡されたスクリプト(-Fileスイッチ)は実行されず、PowerShellはタスクマネージャーによって強制終了されるまでハングしました。
ドキュメントに記載されていないパラメーター「-InputFormat none」を使用する必要があることがわかりました。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1
これは私にとってはトリックでした。
PHPからスクリプトファイルを実行するには、次の例に従う必要があります。
まず、単純なPowerShellスクリプトから始める必要があります。 "test.ps1"という名前のテキストファイルを作成します。
このファイルに次のスクリプトを入力します。
Get-Process
以下のコードをPHP "test.php"という名前のファイルに配置します。次の例でファイルパスを更新することを忘れないでください"C:/ PATH /TO/test.ps1"独自のスクリプトファイルへの絶対パス。
echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; }"');
echo "</pre>";
上記のコードは、実行中のすべてのプロセスのリストを出力します。
Windows PCでスクリプトを実行していて、ファイルパスが原因でエラーメッセージが表示されていたことに注意してください。そのため、ファイルパスのすべてのバックスラッシュをスラッシュに置き換えました。
以下のパラメーターは注目に値します。
PowerShellスクリプトファイル内で関数"my-function"を呼び出し、パラメーター"-myParameter"および"-myOtherParameter "値" 10 "および" 15 "をそれぞれの関数にそれぞれ:
echo "<pre>";
echo Shell_Exec('powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command "& { . \"C:/PATH/TO/test.ps1\"; my-function -myParameter 10 -myOtherParameter 15 }"');
echo "</pre>";