我有一个小小的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()方法一个接一个地发出命令,这样还可以处理返回和任何异常。