我有一个小的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 ...)
有这样的问题吗?或者知道解决方案?
答案 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()方法逐个发出命令,这样您也可以处理返回和任何异常。