我一直在捣乱我的大脑和我的电脑,希望有人可以帮助我。
我有一个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
答案 0 :(得分:0)
好的,我自己想出了这个。
问题在于命令的执行方式。使用&#34;&amp;&#34;强制powershell忽略传递给脚本的参数。正确的方法,因为命令无论如何都是可执行的,是将整个命令构建为字符串并将其全部传递给ps1文件,然后更改ps1文件以使用invoke-expression命令行开关。
param(
[string]$CMD
)
Invoke-expression $CMD