来自 Windows 批处理 (.bat) 脚本的带有 Unix 行结尾的回显文本
Echo text with Unix line endings from a Windows batch (.bat) script
假设我有以下批处理脚本:
For ... DO (
SET VAL=%%B
IF defined VAL echo %%A=%%B >> %OUTPUT_FILEPATH%
)
如何让 echo
使用 Unix(仅换行)行结尾输出?
或者,我可以按原样编写文件,然后再从批处理脚本中转换它吗? (某种查找 /r/n 并用 /n 替换?如果是这样,我该怎么做?)
我想要一个独立的解决方案(即不涉及下载额外实用程序的解决方案,并且可以在批处理脚本本身中完成 [Windows 7])。
取自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%
)
或者,为了避免第一行之后的前导 space:
<nul set/P^=%%A=%%B%\n%^>> %OUTPUT_FILEPATH%
执行此转换的合适方法不是通过批处理文件,而是使用另一种编程语言,如 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
命令的技巧,因此编译此 hybrid .BAT 文件不会出现错误。
在 JScript 代码中:WScript.Stdin.ReadAll()
读取整个重定向的输入文件;如果文件 很大 ,这可能会导致问题。 replace
方法使用正则表达式来识别要替换的文本并将第二个字符串放在它的位置;您可以在 this link 阅读有关该主题的进一步说明。 WScript.Stdout.Write
只是从替换中获取输出并将其发送到屏幕。简单!不是吗? ;-)
如果您可以使用 PowerShell,您可以像这样生成一个 Unix 换行符:
PowerShell -Command Write-Host
您可以将此与 SET /P 技巧结合使用以输出不带换行符的文本并手动添加换行符。例如:
( ECHO | SET /P="Hello World!" & PowerShell -Command Write-Host ) > output.txt
在此之后,output.txt
将包含文本 Hello World!附加了一个 0x0a 字符。
假设我有以下批处理脚本:
For ... DO (
SET VAL=%%B
IF defined VAL echo %%A=%%B >> %OUTPUT_FILEPATH%
)
如何让 echo
使用 Unix(仅换行)行结尾输出?
或者,我可以按原样编写文件,然后再从批处理脚本中转换它吗? (某种查找 /r/n 并用 /n 替换?如果是这样,我该怎么做?)
我想要一个独立的解决方案(即不涉及下载额外实用程序的解决方案,并且可以在批处理脚本本身中完成 [Windows 7])。
取自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%
)
或者,为了避免第一行之后的前导 space:
<nul set/P^=%%A=%%B%\n%^>> %OUTPUT_FILEPATH%
执行此转换的合适方法不是通过批处理文件,而是使用另一种编程语言,如 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
命令的技巧,因此编译此 hybrid .BAT 文件不会出现错误。
在 JScript 代码中:WScript.Stdin.ReadAll()
读取整个重定向的输入文件;如果文件 很大 ,这可能会导致问题。 replace
方法使用正则表达式来识别要替换的文本并将第二个字符串放在它的位置;您可以在 this link 阅读有关该主题的进一步说明。 WScript.Stdout.Write
只是从替换中获取输出并将其发送到屏幕。简单!不是吗? ;-)
如果您可以使用 PowerShell,您可以像这样生成一个 Unix 换行符:
PowerShell -Command Write-Host
您可以将此与 SET /P 技巧结合使用以输出不带换行符的文本并手动添加换行符。例如:
( ECHO | SET /P="Hello World!" & PowerShell -Command Write-Host ) > output.txt
在此之后,output.txt
将包含文本 Hello World!附加了一个 0x0a 字符。