ChatGPT解决这个技术问题 Extra ChatGPT

通过 Windows 批处理文件将长命令拆分为多行

如何在批处理文件中将长命令拆分为多行?


M
Maximilian Burszley

只要您记住插入符号和它后面的换行符已完全删除,您就可以使用插入符号 ^ 拆分长行。所以,如果应该有一个空格,你要打破线,包括一个空格。 (More on that below.)

例子:

copy file1.txt file2.txt

将被写为:

copy file1.txt^
 file2.txt

如果您在 ^ 之前和命令文本之后添加一个空格,则可以在没有空格的情况下开始下一行。
@SebaIllingworth - 不,您可以随时添加 [SPACE]+[^] 和两个空白行,以便在 echo 编辑时创建总共 2 个换行符。
为了安全起见,总是在使用插入符号时以空行结尾,请参阅Simple carat in batch file consumes all memory
@GavinMiller:“复制后的插入符号 ^ 和新行上的 file1.txt 将不起作用” 这不是真的。您可以在任意位置拆分行,包括在单词中间,例如 co^␍py ^␍file1 ^␍file2。我建议您删除您的评论以避免混淆,特别是因为这个问题是如此受欢迎
这里的一个问题是 ^ 必须是该行的最后一个字符 - 即后面没有空格。我遇到了麻烦,结果发现插入符号后有一堆空格 - 在我使用的编辑器中不容易看到。
P
Peter Mortensen

插入符号的规则是:

行尾的插入符号,追加下一行,追加行的第一个字符将被转义。

您可以多次使用插入符号,但整行不得超过最大行长度 ~8192 个字符(Windows XP、Windows Vista 和 Windows 7)。

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

要抑制下一个字符的转义,您可以使用重定向。

重定向必须在插入符号之前。但是在插入符号之前存在一种对重定向的好奇。

如果您在插入符号处放置一个标记,则该标记将被删除。

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

也可以在字符串中嵌入换行符:

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

空行对成功很重要。这仅适用于延迟扩展,否则在换行后将忽略该行的其余部分。

它有效,因为行尾的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在此阶段总是忽略回车)。


带有换行示例的最终代码块不显示空行,即使它存在。 (至少它没有出现在 IE7 中)尝试使用块引用重新格式化。
问题是,我们应该支持一个不遵守规则的坏工具(有人称它为浏览器,但事实并非如此)还是应该切换到浏览器?
我的值周围有双引号,如 set var="text here ^" 但它不起作用。去掉双引号就可以了。
@jeb,写了一个失败的 cmd 脚本示例,但后来发现了这个问题:stackoverflow.com/questions/4643376/…
如果下一行以引号开头,这将不起作用:copy ^[newline]"file1.txt" ^[newline]"file2.txt" 不起作用!我必须添加一个空格:copy ^[newline] "file1.txt" ^[newline] "file2.txt"
3
3 revs

(这基本上是对 Wayne's answer 的重写,但清除了插入符号周围的混乱。所以我将它作为 CW 发布。我并不羞于编辑答案,但 完全重写它们< /strong> 似乎不合适。)

您可以使用插入符号 (^) 分隔长行,只需记住插入符号和其后的换行符已从命令中完全删除,因此如果将其放在空格所在的位置必需(例如在参数之间),请确保也包含空格(在 ^ 之前,或在下一行的开头  - 后一种选择可能有助于更清楚地说明它是一个延续)。

示例:(均在 Windows XP 和 Windows 7 上测试)

xcopy file1.txt file2.txt

可以写成:

xcopy^
 file1.txt^
 file2.txt

或者

xcopy ^
file1.txt ^
file2.txt

甚至

xc^
opy ^
file1.txt ^
file2.txt

(最后一个有效,因为 xc^ 之间没有空格,下一行的开头也没有空格。因此,当您删除 ^ 和换行符时,您会得到...{4 }。)

为了可读性和完整性,最好只在参数之间进行中断(确保包含空格)。

确保 ^不是批处理文件中的最后一项,如 appears to be a major issue with that


T
Todd Partridge

多个命令可以放在括号中并分布在多行;所以像 echo hi && echo hello 这样的东西可以这样写:

( echo hi
  echo hello )

变量也可以提供帮助:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

我还注意到插入符号 (^) 中的 if 条件仅在存在空格时才喜欢它们:

if exist ^

cmd1.bat && cmd2.bat 行与括号形式不同:执行 cmd2.bat iff cmd1.bat 成功执行(- 不设置 %errorcode%)。后一种形式无条件执行。有点出乎意料(至少对我而言)是,显然,您不能同时使用 + 的组合,即在换行符之前添加 &&
( echo <line break here> hello ) 产生一个空行。
最好最干净的答案!正则表达式中的插入符号很丑陋且有问题
M
Mohammed Safwat

然而,似乎在 for 循环的值中间拆分不需要插入符号(实际上尝试使用插入符号将被视为语法错误)。例如,

for %n in (hello
bye) do echo %n

请注意,在 hello 之后或 bye 之前甚至不需要空格。


当然,这是 for 语法的一部分:“for-set”中元素的分隔符是空格、逗号、分号、等号、TAB 字符和换行符。
但是如果 do 部分包含多个/嵌套的 if-else 语句怎么办?
然后,您可以简单地使用括号将 for %n 之类的语句括在 (hello bye) do ( echo %n echo %n )
这是一种可能的方法,但您首先需要将所有项目存储在一行中并执行一次。
S
Simon H

搜索“如何拆分长的 DOS 批处理文件行”时我没有找到的一件事是如何拆分包含长引用文本的内容。实际上,它已包含在上面的答案中,但并不明显。使用插入符号来逃避它们。例如

myprog "needs this to be quoted"

可以写成:

myprog ^"needs this ^
to be quoted^"

但要注意在用插入符号结束一行后用插入符号开始一行 - 因为它会以插入符号出现..?:

echo ^"^
needs this ^
to be quoted^
^"

->“需要引用这个^”


您无需转义最后一个引号。新行第一列的插入符号(或任何其他特殊字符)将被多行插入符号转义
好点子! :) ...我正在使用它来拆分非常长的 ffmpeg '-vf' 参数,它正在发挥作用。
n
npocmaka

虽然 carret 是更好的方法,但这里还有一种使用宏的方法,该宏通过传递的参数构造命令:

@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "{{=setlocal enableDelayedExpansion&for %%a in (" & set "}}="::end::" ) do if "%%~a" neq "::end::" (set command=!command! %%a) else (call !command! & endlocal)"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

%{{%
    echo
    "command"
    written
    on a
    few lines
%}}%

没有插入符号的命令更容易阅读,但使用特殊符号(例如括号、重定向等)会破坏它。因此,您可以将其用于更简单的情况。尽管您仍然可以将参数括在双引号中


这就是黑魔法或牙买加巫术的样子。