使用Windows批处理(.bat)脚本中的Unix行结尾回显文本

时间:2016-11-25 11:02:52

标签: batch-file echo linefeed

说我有以下批处理脚本:

For ... DO (
SET VAL=%%B
IF defined VAL echo %%A=%%B >> %OUTPUT_FILEPATH%
)

如何使用Unix(只是换行)行结尾输出echo

或者,我可以按原样编写文件,然后从批处理脚本转换它吗? (某种查找/ r / n并用/ n替换?如果是这样,我该怎么做?)

我想要一个独立的解决方案(即不涉及下载额外实用程序的解决方案,可以在批处理脚本本身[Windows 7]中完成)。

3 个答案:

答案 0 :(得分:3)

执行此转换的合适方法不是通过批处理文件,而是使用其他编程语言,如JScript;这样,转换过程快速可靠。但是,您不需要数百行程序就可以实现像这一样简单的替换。下面的两行批处理文件执行此转换:

@set @a=0 /* & cscript //nologo //E:JScript "%~F0" < input.txt > output.txt & goto :EOF */

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\r\n/g,"\n"));

编辑:我添加了对原始代码的修改,允许以标准方式在批处理部分中包含更多命令。

@set @a=0 /*

@echo off
set "OUTPUT_FILEPATH=C:\Path\Of\The\File.txt"
cscript //nologo //E:JScript "%~F0" < "%OUTPUT_FILEPATH%" > output.txt
move /Y output.txt "%OUTPUT_FILEPATH%"

goto :EOF */

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\r\n/g,"\n"));

第一行是隐藏JScript代码中cscript命令的技巧,因此编译此混合 .BAT文件不会发出错误。

在JScript代码中:WScript.Stdin.ReadAll()读取整个重定向的输入文件;如果文件 large ,这可能会导致问题。 replace方法使用正则表达式来标识要替换的文本,并将第二个字符串放在其位置;您可以在this link阅读有关此主题的进一步说明。 WScript.Stdout.Write只取出替换的输出并将其发送到屏幕。简单!不是吗?的 ;-)

答案 1 :(得分:2)

如果可以使用PowerShell,则可以生成这样的Unix换行符:

PowerShell -Command Write-Host

您可以将其与SET / P技巧结合使用以输出不带换行符的文本并手动添加换行符。例如:

( ECHO | SET /P="Hello World!" & PowerShell -Command Write-Host ) > output.txt

此后,output.txt将包含文本Hello World!并附加一个0x0a字符。

答案 2 :(得分:1)

取自 Macros with parameters appended

格式化很棘手​​,但请尝试

set ^"LF=^

^" Don't remove previous line & rem line feed (newline)
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"& rem Define newline with line continuation

For ... DO (
SET VAL=%%B
IF defined VAL <nul set/P^=%%A=%%B%\n%>> %OUTPUT_FILEPATH%
)

或者,为了避免第一行之后的前导空格:

<nul set/P^=%%A=%%B%\n%^>> %OUTPUT_FILEPATH%