使用参数从PHP执行powershell脚本

时间:2014-04-28 16:52:52

标签: php variables powershell powershell-v3.0

我一直在捣乱我的大脑和我的电脑,希望有人可以帮助我。

我有一个PHP站点,需要执行一个powershell脚本,该脚本依次执行并执行。

调用.ps1的PHP是

define('updaterPath','C:\\artemis\\DbUpdateUtility1.0.12.2');
define('outputLocation',updaterPath.'\\Output');
$CMD = updaterPath . '\\ArtemisXmlUtil.exe';
$action = 'import';
$args= ' -f' . outputLocation;
$psScriptPath = '.\\get-process.ps1';
$query = shell_exec("powershell -command $psScriptPath -cmd '$CMD' -action '$action' -paras '$args' < NUL");

我的.ps1脚本是:

param(
[string]$CMD,
[string]$action,
[string]$paras
)

& $CMD $action $paras

现在,当我回显完整命令时,它看起来很完美,可以复制并粘贴到powershell中并成功运行,但是当我尝试从php实际执行它时,它只运行$ CMD变量并忽略$ action和$ paras。

我尝试将变量全部变为1个字符串,但是因为甚至无法看到可执行文件而失败。

完整的命令看起来像:

C:\artemis\DbUpdateUtility1.0.12.2\ArtemisXmlUtil.exe import -fC:\artemis\DbUpdateUtility1.0.12.2\Output

1 个答案:

答案 0 :(得分:0)

好的,我自己想出了这个。

问题在于命令的执行方式。使用&#34;&amp;&#34;强制powershell忽略传递给脚本的参数。正确的方法,因为命令无论如何都是可执行的,是将整个命令构建为字符串并将其全部传递给ps1文件,然后更改ps1文件以使用invoke-expression命令行开关。

param(
[string]$CMD
)

Invoke-expression $CMD