12

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たが、それでも同じです。

4

4 に答える 4

9

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

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

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

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

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

于 2011-03-15T23:19:58.287 に答える
2

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

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

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

文書化されていないパラメーター「-InputFormat none」を使用する必要があることがわかりました。

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

これは私にとってはうまくいきました。

于 2012-01-09T21:21:02.190 に答える
2

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

powershell.exe -executionPolicy Unrestricted

そしたらきっとうまくいく。

于 2012-03-20T06:14:05.720 に答える