Exec ('script.ps1')返回错误,cmd>scrtipt.Ps1运行成功


exec('script.ps1') returns error, cmd> scrtipt.ps1 runs success

我有一个小小的PowerShell脚本来获取远程磁盘空间,并将其保存到Postgre DB上的一个表中。

如果我在windows cmd上执行命令,它会运行成功。

C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe -File C:'xampp'....'skripts'getDiskSpace.ps1 -Command -arg 192.168.178.178

但是如果我使用PHP exec()函数我得到一个odbc错误

exec("C:''Windows''System32''WindowsPowerShell''v1.0''powershell.exe -File C:''xampp''....''skripts''getDiskSpace.ps1 -Command -arg 192.168.178.178", $output);

如果我使用PHP escapeshellarg()函数,exec()的$输出是NULL


$output的内容为:

[Microsoft][ODBC Driver Manager]数据源名称未找到指定的默认驱动

我不知道为什么,我用

指定ODBC驱动程序
$conn = New-Object System.Data.Odbc.OdbcConnection
$conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"

PostgreSQL x64 ODBC驱动已安装!

我在Windows 2008 SP2企业服务器......上工作(想要回一个linux web服务器:D…)

有人遇到这样的问题吗?或者知道答案?

这是一个允许PHP获取一个真正的Powershell并与之动态交互的项目。点击这里下载:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shellObj    = 'MTS'Factories::getDevices()->getLocalHost()->getShell('powershell');
$strCmd1   = 'get-WmiObject win32_logicaldisk';
$return1   = $shellObj->exeCmd($strCmd1);

返回将从powershell返回命令返回或错误,就像您坐在控制台前一样。然后用PHP解析并插入。

此外,您可以对$shellObj发出任何您喜欢的命令,该环境将在PHP脚本的整个生命周期中得到维护。因此,不需要在脚本文件中捆绑命令,只需使用exeCmd()方法一个接一个地发出命令,这样还可以处理返回和任何异常。