web-dev-qa-db-ja.com

PHPからPowershellスクリプトを実行する

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、しかしそれはまだ同じです。

12
heshanh

コマンドは単一引用符で囲まれているようです。それらを削除すると、コマンドは実行されるはずです。

Shell_execは、実行したコマンドからの出力を返します。さらに診断するには、出力を変数に格納してから出力します。

$output= Shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '</pre>' );

スクリプトの実行を必ず有効にしてください。この機能はデフォルトでオフになっています。 PowerShellスクリプトを実行する各マシンでスクリプトの実行を有効にする必要があります。詳細については、about help_signingを実行してください。

マイクロソフトは、Set-ExecutionPolicy RemoteSigned -Scope LocalMachineを実行することをお勧めします。これにより、マシンのすべてのユーザーアカウントでローカルスクリプトを問題なく実行できますが、インターネットからダウンロードしたスクリプトを実行するには確認が必要です。これは、管理プロンプトで実行する必要があります。 64ビットのオペレーティングシステムを実行している場合は、64ビットと32ビットの両方のシェルからこれを行う必要があります。

8
Aaron Jensen

使用する "-executionPolicy Unrestricted "とコマンド" powershell.exe "。したがって、コマンドは次のようになります。

powershell.exe -executionPolicy Unrestricted

それならきっとうまくいきます。

2
Shobin Markose

これを別のウェブサイトで見つけて、私はそれを渡すと思いました:

MicrosoftのWindows PowerShellの標準出力をキャプチャするために、Windows API(リダイレクトされた入力と出力を持つ子プロセスの作成)を使用するプログラムをデバッグしていました。

PowerShellに渡されたスクリプト(-Fileスイッチ)は実行されず、PowerShellはタスクマネージャーによって強制終了されるまでハングしました。

ドキュメントに記載されていないパラメーター「-InputFormat none」を使用する必要があることがわかりました。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1

これは私にとってはトリックでした。

2
Philip

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でスクリプトを実行していて、ファイルパスが原因でエラーメッセージが表示されていたことに注意してください。そのため、ファイルパスのすべてのバックスラッシュをスラッシュに置き換えました。

以下のパラメーターは注目に値します。

  1. -InputFormat none-PowerShellのバグのおかげで、スクリプトは実行を終了したり終了したりしません。このパラメーターは、このバグの回避策を提供します。
  2. -ExecutionPolicy ByPass-このパラメーターがない場合、コードは低い特権のエラーメッセージをスローします。
  3. -NoProfile-このパラメーターを使用すると、スクリプトはより速く、より予測どおりに実行されます。
  4. -Command-「-File」パラメーターの代わりに「-Command」パラメーターを使用してスクリプトファイルをロードすることにより、柔軟性が向上します。たとえば、スクリプト内で関数を呼び出してその関数にパラメーターを送信する必要がある場合、「-Command」パラメーターを使用する必要があります。

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>";
0
DrupalFever