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. 这允许机器上的所有用户帐户毫无问题地运行本地脚本,但需要确认才能运行从 Internet 下载的脚本。这需要在管理提示符下运行。如果您运行的是 64 位操作系统,则需要从 64 位和 32 位 shell 执行此操作。

于 2011-03-15T23:19:58.287 回答
2

在另一个网站上找到了这个,并认为我会传递它:

我正在调试一个程序,该程序使用 Windows API(创建具有重定向输入和输出的子进程)来捕获 Microsoft 的 Windows PowerShell 的标准输出。

传递给 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 回答
2

要从 PHP 执行脚本文件,您应该遵循以下示例:

您应该从一个简单的 PowerShell 脚本开始。创建一个名为“ test.ps1 ”的文本文件。

现在在此文件中键入以下脚本:

Get-Process

将下面的代码放在名为“ test.php ”的 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 - 通过“-Command”参数加载脚本文件,而不是“-File”参数,您将拥有更大的灵活性。例如,如果您需要在脚本中调用一个函数并向该函数发送参数,则需要使用“-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>";
于 2019-07-16T08:37:07.130 回答