1. ホーム
  2. php

[解決済み] phpからPowershellスクリプトを実行する

2022-02-16 21:24:03

質問内容

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>' . $output . '</pre>';

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

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