使用 new-Object 在 PHP 中运行 powershell


Run powershell in PHP with new-Object

我必须从PHP管理收银机。如果我通过cmd运行以下命令,则没有问题。收银机完美地打印字符串。

我按以下顺序编写命令:

powershell
[System.IO.Ports.SerialPort]::getportnames()
$port= new-Object System.IO.Ports.SerialPort COM1,9600,None,8,one
$port.open()
$port.WriteLine("1R")
// Print string 1R on cash register

当我尝试从 php 执行此操作时,问题就来了。我创建了一个Web服务器(XAMPP(来确保它可以将命令从php发送到串口。我尝试了各种编写脚本的方法,但没有一种奏效。这是我.php的一个例子

<?php
$patch = "c:''Windows''System32'WindowsPowerShell'v1.0'powershell.exe";
$runCMD1 = $patch .'[System.IO.Ports.SerialPort]::getportnames()';
$runCMD2 = '$port= new-Object System.IO.Ports.SerialPort COM1,9600,None,8,on';
$runCMD3 = '$port.open()';
$runCMD4 = '$port.WriteLine("1R")';
exec($runCMD1, $out1); // Return COM1
exec($runCMD2, $out2); // Return Nothing
exec($runCMD3, $out3); // Return Nothing
exec($runCMD3, $out3); // Return Nothing
?>

每个人都可以帮助我吗?谢谢。

每次执行powershell.exe时,您只将脚本的一行传递给全新的实例。这就是为什么它不起作用的原因。需要将整个脚本传递到单个 powershell 实例。这可以通过多种方式完成:

通过StandradInput:

powershell.exe -Command - < script.ps1

通过Command参数的单行参数:

powershell.exe -Command '[System.IO.Ports.SerialPort]::getportnames() ; $port= new-Object System.IO.Ports.SerialPort COM1,9600,None,8,one ; $port.open() ; $port.WriteLine("1R")'

通过 Base64 字符串EncodedCommand参数:

powershell.exe -EncodedCommand 'WwBTAHkAcwB0AGUAbQAuAEkATwAuAFAAbwByAHQAcwAuAFMAZQByAGkAYQBsAFAAbwByAHQAXQA6ADoAZwBlAHQAcABvAHIAdABuAGEAbQBlAHMAKAApACAAOwAgACQAcABvAHIAdAA9ACAAbgBlAHcALQBPAGIAagBlAGMAdAAgAFMAeQBzAHQAZQBtAC4ASQBPAC4AUABvAHIAdABzAC4AUwBlAHIAaQBhAGwAUABvAHIAdAAgAEMATwBNADEALAA5ADYAMAAwACwATgBvAG4AZQAsADgALABvAG4AZQAgADsAIAAkAHAAbwByAHQALgBvAHAAZQBuACgAKQAgADsAIAAkAHAAbwByAHQALgBXAHIAaQB0AGUATABpAG4AZQAoACIAMQBSACIAKQA='

或者,您可以将临时文件拖放到磁盘:

powershell.exe -File 'C:'Windows'Temp'tempscript.ps1'

解决方案:

.PHP文件:

<?php
$scriptname = 'script.ps1';
$runCMD = "powershell.exe -executionpolicy unrestricted - Command - < $scriptname";
exec($runCMD,$out);
echo join($out);
?>

.ps1 文件:

[System.IO.Port.SerialPort]::getportnames()
$port= new-Object System.IO.Port.SerialPort COM1,9600,None,8,one
$port.open()
$port.WriteLine("1R")

感谢@beatcracker