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

时间:2016-09-26 10:11:31

标签: php postgresql powershell odbc

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

如果我在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()的$ output为NULL

$ output的内容是:

  

[Microsoft] [ODBC驱动程序管理器]未找到数据源名称且没有   指定默认驱动程序

我不知道为什么,我用

指定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网络服务器:D ...)

有这样的问题吗?或者知道解决方案?

1 个答案:

答案 0 :(得分:0)

这是一个允许PHP使用真正的Powershell动态获取和交互的项目。在此处获取:https://github.com/merlinthemagic/MTS

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

$shellObj    = \MTS\Factories::getDevices()->getLocalHost()->getShell('powershell');

$strCmd1   = 'get-WmiObject win32_logicaldisk';
$return1   = $shellObj->exeCmd($strCmd1);

返回将为您提供来自powershell的命令return OR error,就像您坐在控制台一样。然后在PHP中解析并插入。

此外,您可以针对$ shellObj发出任何您喜欢的命令,在PHP脚本的整个生命周期内都会维护该环境。因此,不是在脚本文件中捆绑命令,而是使用exeCmd()方法逐个发出命令,这样您也可以处理返回和任何异常。