PHP proc_open() 转义多行参数

Posted

技术标签:

【中文标题】PHP proc_open() 转义多行参数【英文标题】:PHP proc_open() escape multiline argument 【发布时间】:2021-11-25 15:09:06 【问题描述】:

我正在尝试在 Windows 上使用 proc_open() 将字符串从 php 传递给批处理文件。除非我传递的字符串是多行的,否则它工作正常,因为它用换行符打破了命令。我尝试了各种转义方法,但似乎都不起作用:

cmd 样式 - 打印转义符号并换行:

proc_open('script.bat -m "this is ^\n multiline"', $desc, $pipes)

另一个尝试 - 打印整个字符串:

proc_open('script.bat -m "this is ^\\n multiline"', $desc, $pipes)

powershell 样式 - 打印整个字符串:

proc_open('script.bat -m "this is `n multiline"', $desc, $pipes)

无论我尝试什么,它要么打破字符串,要么按原样打印,没有换行符。

我错过了什么或做错了什么?如何通过proc_open() 获取多行参数?

【问题讨论】:

看起来你在 " 之前的 " 之后缺少一个撇号 - ' ,因此例如第一个应该是: proc_open('script.bat -m "this is ^\n multiline"', $desc, $pipes); 您在所有尝试中都打开了一个撇号 ' 字符串,但没有关闭它.... @Shlomtzion 对不起,我在尝试重现问题时出错了。我编辑了这个问题。但是它与问题的重点无关,因为我在实际脚本中很好。 在 powershell 示例中,您不会错过 ' - 撇号 ...这可能就是它在那里工作的原因.... @Shlomtzion 我的实际脚本中有结束撇号。这只是我为了这个问题而写一个例子时的错误。 嗯,这听起来像是 urlencode 可以解决的问题,有一种方法可以在批处理文件中对字符串进行 urldecode ......我真的在这里吐球 :) 我不知道它是否会工作。但如果你想尝试:***.com/questions/28221685/urldecode-in-batch-file 【参考方案1】:

即使您将其正确转义,您的批处理文件也几乎不可能获取多行参数。

在尝试修复 php 中的转义之前,您应该直接从 cmd.exe 自己测试批处理脚本

c:\> script.bat This_is_^
More? 
More? multiline

一个简单的echo %*set "arg=%~1" 无法处理多行参数,但有一些技巧,例如:How to receive even the strangest command line parameters?Im passing a multi line text as argument which will ... has only 1 line

【讨论】:

以上是关于PHP proc_open() 转义多行参数的主要内容,如果未能解决你的问题,请参考以下文章

python多行输出与转义

go语言学习笔记 — 基础 — 基本数据类型 — 字符串:转义定义多行字符串

python | 变量与数据 | 字符串转义 | 输入多行

笨方法学python--多行,转义序列

真正的转义字符串与绑定参数

如何转义 php mysqli 查询? [复制]