gpt4 book ai didi

php - 从不知道当前配置文件的 PHP 运行 Windows Powershell

转载 作者:可可西里 更新时间:2023-11-01 10:43:30 26 4
gpt4 key购买 nike

我为所有机器用户定义了一些函数和变量,如下所示:

Set-Content $Profile.AllUsersCurrentHost (Get-Content path/to/myprofile.ps1)

让我们调用我定义的函数之一 Do-Stuff。这很好用。任何时候调用 Powershell 控制台,然后键入“Do-Stuff”+ENTER,它都可以工作。

现在我已经尝试通过几种方式从 PHP 调用此函数,但我遇到了一些问题。考虑一下:

$res = shell_exec( 'Powershell Do-Stuff');
print_r($res);

我得到的是这个错误:

Do-Stuff: The term 'Do-Stuff' is not recognized as the name of a 
cmdlet, function, script file, or operable program....

我也试过:

$res = shell_exec( 'Powershell -File path/to/script.ps1');
print_r($res);

如果文件 script.ps1 确实包含 Do-Stuff 或任何其他定义的函数,我得到的是相同类型的错误消息。

现在这告诉我调用 PHP 脚本未被识别为 Windows 机器用户,并且当前加载的 $Profile 未被应用。

那么解决这个问题的方法是什么?如何获取当前用户或所有用户的加载配置文件以应用于正在运行的 PHP 脚本?

最佳答案

我有一个解决这个问题的方法,使用 -NoProfile,然后点源配置文件。

在下面的例子中,配置文件是includes.ps1:

$cmdlet = 'Do-Stuff';
$cmd = 'Powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { . \includes.ps1; '.$cmdlet.' }"';
shell_exec($cmd);

将其包含在可重用函数中可能对您有用:

<?php
function run_ps_command($cmdlet, $async=true){
$cmd = 'Powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { . \Includes.ps1; '.$cmdlet.' }"';
if($async){
$WshShell = new COM("WScript.Shell");
$res = $WshShell->Run( $cmd, 0, false);
}else{
$res = shell_exec($cmd);
}
return $res;
}
?>

$async 参数允许您运行此命令而无需 PHP 等待 PowerShell 脚本的输出。优点是 PHP 代码执行速度更快,缺点是:你不知道你的脚本是否成功运行,或者在途中遇到任何问题;)

关于php - 从不知道当前配置文件的 PHP 运行 Windows Powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com