我可以将命令行参数中的换行符传递给批处理文件中的 Windows 可执行文件吗?

我可以将命令行参数中的换行符传递给批处理文件中的 Windows 可执行文件吗?

假设我有一个可执行文件,我想从.bat文件向其传递一个参数。问题是参数值newline中必须有一个。

当我尝试以下操作时:

"c:\folder\my app.exe" parameter="line1\nline2"

结果不会被解释为line1和之间有一个新行line2

有什么想法可以做到吗?

答案1

是的,你可以。
使用一个小的批处理文件来定义\n变量。

@echo off

(set \n=^^^
%=empty, do not delete this line =%
^
%=empty, do not delete this line =%
)

myApp.exe Line1%\n%Line2

即使参数包含引号,它也能正常工作。
引号必须转义。

myApp.exe parameter=^"aaa%\n%bbb^"

新线的定义看起来有点复杂,但它是由插入符号的规则

答案2

不,不能通过批处理文件本身。但是 exe 文件或其他程序可以将包含换行符的参数传递给其他 Exe 文件。

因此,您的解决方案是创建一个简单的工具来解析您的参数,您可以将其称为

runner "c:\folder\my app.exe" parameter="line1\nline2"

它将替换\n真正的 LF 字符(此处显示为)并使用 P/Invoke 执行调用:

"c:\folder\my app.exe" parameter="line1↵line2"

克服此限制的另一种方法是使用 PowerShell。它具有不同的命令行解析。

答案3

不可能做到。

类似于为什么 chown Unix 命令使用冒号作为分隔符:chown 假定用户名以冒号结尾。同样,批处理文件也有文件格式。

批处理文件的文件格式假定换行符结束一行。不支持转义序列。因此,您要求的操作无法完成。

一种可能的解决方法是,如果程序识别转义序列,例如识别 \n。(JScript 支持 .js 文件,CScript 可以使用,并支持 unescape 命令。 WScript.Echo(unescape("%0d0a"));

处理此问题的另一种常见方法是程序是否支持数据流,数据流可以是指定的文件名或“标准输入”流。可以通过这种方式向程序提供换行符/序列。

多个程序都使用了这些方法。我不记得有任何方法可以让批处理忽略换行符,也没有任何其他标准化方法尝试以所有/大多数程序都能识别您要引用的字符的方式对该字符进行编码。

相关内容