从 php 执行 Powershell 脚本
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5317315/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
executing a Powershell script from php
提问by heshanh
I'm trying to execute a powershell script from PHP, but it does not seem to work.
我正在尝试从 PHP 执行 powershell 脚本,但它似乎不起作用。
The script 'newEvent.ps1' creates an event on the Exchange server.
脚本“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>";
It outputs:
它输出:
$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] =>
)
If I run powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1
on the command-line, it works fine.
如果我powershell.exe C:\wamp\www\ant\assets\ps\newEvent.ps1
在命令行上运行,它工作正常。
This is the first time im attempting something like this. I ran Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
but it still gives me the same error.
In fact I ran Set-ExecutionPolicy unristricted
, but it's still the same.
这是我第一次尝试这样的事情。我跑了,Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
但它仍然给我同样的错误。事实上我跑了Set-ExecutionPolicy unristricted
,但还是一样。
采纳答案by Aaron Jensen
It looks like your command is surrounded by single-quotes. I think if you remove them, your command should run.
看起来您的命令被单引号包围。我想如果你删除它们,你的命令应该运行。
shell_exec
returns the output from the command you run. To further diagnose, store the output in a variable, then print it out:
shell_exec
返回您运行的命令的输出。要进一步诊断,请将输出存储在变量中,然后将其打印出来:
$output= shell_exec($runCMD);
echo( '<pre>' );
echo( $output );
echo( '</pre>' );
Make sure you enable running scripts. That capability is turned off by default. You have to enable the execution of scripts on each machine you want to run PowerShell scripts. Run about help_signing
for more information.
确保启用正在运行的脚本。该功能默认关闭。您必须在要运行 PowerShell 脚本的每台计算机上启用脚本的执行。运行about help_signing
以获取更多信息。
Microsoft recommends running Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
. This allows all user accounts on a machine to run local scripts without issue, but requires confirmation to run scripts downloaded from the internet. This needs to be run in an administrative prompt. If you are running a 64-bit operating system, you'll need to do this from both a 64-bit and 32-bit shell.
Microsoft 建议运行Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
. 这允许机器上的所有用户帐户都可以毫无问题地运行本地脚本,但需要确认才能运行从 Internet 下载的脚本。这需要在管理提示中运行。如果您运行的是 64 位操作系统,则需要从 64 位和 32 位 shell 执行此操作。
回答by Philip
Found this on another website and thought I would pass it along:
在另一个网站上找到了这个,并认为我会传递它:
I was debugging a program that uses Windows API (Creating a Child Process with Redirected Input and Output) to capture stdout of Microsoft's Windows PowerShell.
Script passed to PowerShell (-File switch) didn't execute and PowerShell just hanged until killed by Task Manager.
It turns out that you need to use undocumented parameter “-InputFormat none”:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1
我正在调试一个程序,该程序使用 Windows API(创建具有重定向输入和输出的子进程)来捕获 Microsoft 的 Windows PowerShell 的标准输出。
传递给 PowerShell 的脚本(-File 开关)没有执行,PowerShell 只是挂起,直到被任务管理器杀死。
事实证明,您需要使用未公开的参数“-InputFormat none”:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -InputFormat none -File file.ps1
This did the trick for me.
这对我有用。
回答by Shobin Markose
Use "-executionPolicy Unrestricted
" along with the command "powershell.exe
". Therefore the command will be :
将“ -executionPolicy Unrestricted
”与命令“ powershell.exe
”一起使用。因此命令将是:
powershell.exe -executionPolicy Unrestricted
Then it will surely works.
那么它肯定会起作用。
回答by DrupalFever
To execute a script file from PHP you should follow this example:
要从 PHP 执行脚本文件,您应该遵循以下示例:
You should start out with a simple PowerShell script. Create a text file with the name "test.ps1".
您应该从一个简单的 PowerShell 脚本开始。创建一个名为“ test.ps1”的文本文件。
Now type the following script in this file:
现在在此文件中键入以下脚本:
Get-Process
Place the code below in a PHP file named "test.php". Remember to update the file path in the following example "C:/PATH/TO/test.ps1"with the absolute path to your own script file.
将下面的代码放在名为“ 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>";
The above code will output a list of all your running processes.
上面的代码将输出所有正在运行的进程的列表。
Note that I was running my script in a Windows PC and I was getting error messages because of the file path. So, I replaced all backslashes from the file path with forward slashes.
请注意,我在 Windows PC 中运行我的脚本,并且由于文件路径而收到错误消息。所以,我用正斜杠替换了文件路径中的所有反斜杠。
The following parameters are worthy of note:
以下参数值得注意:
- -InputFormat none- Thanks to a bug in PowerShell, the script will never finish running or exit. This parameter provides a workaround this bug.
- -ExecutionPolicy ByPass- Without this parameter, the code will throw a low privilege error message.
- -NoProfile- With this parameter, your script will run faster and more predictably.
- -Command- By loading your script file through the "-Command" parameter, instead of the "-File" parameter, you will have greater flexibility. If, for example, you needed to call a function inside your script and send parameters to that function, you would need to use the "-Command" parameter.
- -InputFormat none- 由于 PowerShell 中的一个错误,脚本将永远不会完成运行或退出。此参数提供了此错误的解决方法。
- -ExecutionPolicy ByPass- 如果没有此参数,代码将抛出低权限错误消息。
- -NoProfile- 使用此参数,您的脚本将运行得更快、更可预测。
- -Command- 通过“-Command”参数而不是“-File”参数加载您的脚本文件,您将拥有更大的灵活性。例如,如果您需要在脚本中调用一个函数并向该函数发送参数,则需要使用“-Command”参数。
Here is an example of how to call a function "my-function"inside your PowerShell script file and pass the parameters "-myParameter"and "-myOtherParameter"to that function with the values "10"and "15"respectivelly:
下面是一个示例,说明如何在 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>";