我必须从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