Windows下如何将程序输出管道传递给PHP (-r)命令?
嘿,这个问题我之前在Windows上折腾PHP的时候也踩过坑!主要是Windows的命令提示符(cmd)和Linux的shell在管道处理、参数解析上的逻辑差异搞的鬼,咱们一步步来解决:
一、直接通过管道执行代码的正确姿势
在Windows下,你不能像Linux那样直接把管道内容传给php -r(因为cmd不会自动把管道内容当作-r的参数),得让PHP主动读取标准输入的内容并执行。用php://stdin这个内置流就能实现:
echo 4; | php -r "eval(file_get_contents('php://stdin'));"
执行后就能正常输出4啦!
如果要执行带引号的代码,比如echo 'Hello PHP';,注意cmd里的引号规则——用双引号包裹整个PHP代码,内部的单引号直接用就行:
echo 'Hello PHP'; | php -r "eval(file_get_contents('php://stdin'));"
要是用PowerShell的话,引号处理更灵活,写法类似:
echo 'echo "Hi from PowerShell + PHP";' | php -r "eval(file_get_contents('php://stdin'));"
二、读取文件中代码的方法
如果你的PHP代码存在文件里(比如test.php),最直接的方式就是:
php test.php
要是非得用-r参数的方式读取文件执行,也可以这么写:
php -r "eval(file_get_contents('test.php'));"
另外PHP还支持直接从标准输入读取文件内容运行,更简洁:
php < test.php
为什么原来的写法在Windows下不行?
Linux的shell(比如bash)会通过管道把前面命令的输出当作后续命令的参数(比如配合$(cat)这类语法),但Windows的cmd没有这个自动传递的逻辑。当你执行echo 4;|php -r时,php -r后面没有接具体的代码参数,PHP就会默认打印使用说明,这就是你看到的现象。
内容的提问来源于stack exchange,提问作者barlop
相关产品推荐
相关产品推荐

