假设我有一个可执行文件,我想从.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"));
)
处理此问题的另一种常见方法是程序是否支持数据流,数据流可以是指定的文件名或“标准输入”流。可以通过这种方式向程序提供换行符/序列。
多个程序都使用了这些方法。我不记得有任何方法可以让批处理忽略换行符,也没有任何其他标准化方法尝试以所有/大多数程序都能识别您要引用的字符的方式对该字符进行编码。