Windows 带双引号的批处理文件多行命令

Windows 带双引号的批处理文件多行命令,windows,batch-file,cmd,Windows,Batch File,Cmd,当使用^symbol输入带参数的多行命令时,当使用双引号使用带空格的字符串时,^symbol也会被传递,有人能解释一下这种方式吗 working.cmd @echo off call openfiles.cmd ^ C:\dir\filename.txt ^ C:\another_dir\another_file.txt @echo off call openfiles.cmd ^ "C:\dir with spaces\file with spaces.txt" ^ "C:\anothe

当使用^symbol输入带参数的多行命令时,当使用双引号使用带空格的字符串时,^symbol也会被传递,有人能解释一下这种方式吗

working.cmd

@echo off 
call openfiles.cmd ^
C:\dir\filename.txt ^
C:\another_dir\another_file.txt
@echo off 
call openfiles.cmd ^
"C:\dir with spaces\file with spaces.txt" ^
"C:\another dir with spaces\another file with spaces.txt"
notworking.cmd

@echo off 
call openfiles.cmd ^
C:\dir\filename.txt ^
C:\another_dir\another_file.txt
@echo off 
call openfiles.cmd ^
"C:\dir with spaces\file with spaces.txt" ^
"C:\another dir with spaces\another file with spaces.txt"
openfiles.cmd看起来像

@echo off
for %%x in (%*) do (

    IF EXIST %%x (
        call "c:\Program Files\Notepad++\notepad++.exe" %%x
    ) ELSE (
        call echo Not found %%x
    )

)

pause
我得到的错误看起来像

C:\>call openfiles.cmd "C:\dir with spaces\file with spaces.txt" ^
ELSE was unexpected at this time.

在尝试了一些不同的东西后,我设法在双引号前留出一个额外的空间使它工作。 将notworking.cmd更改为以下已工作

@echo off 
call openfiles.cmd ^
 "C:\dir with spaces\file with spaces.txt" ^
 "C:\another dir with spaces\another file with spaces.txt"

请注意双引号前面的空格。问题是,第二行开头的引号将由多行插入符号转义。
因此,行中的最后一个引号开始引用而不是停止引用,因此第二行中的插入符号作为普通字符处理

call openfiles.cmd ^"C:\dir with spaces\file with spaces.txt" ^
**This is a seperate line** "C:\another dir with spaces\another file with spaces.txt"
插入符号规则: 插入符号将转义下一个角色,因此该角色将丢失所有特殊效果。
如果下一个字符是换行符,则删除该字符并获取下一个字符(即使这也是换行符)

用这个简单的规则,你可以解释如下事情

echo #1 Cat^&Dog
echo #2 Cat^
&Dog
echo #3 Redirect to > Cat^
 Dog

setlocal EnableDelayedExpansion
set linefeed=^


echo #4 line1!linefeed!line2
#3
创建一个名为“Cat Dog”的文件,因为空间已转义,不再用作分隔符

但还是有可能打破这条规则
您只需将任何重定向放在插入符号前面,它仍然会删除换行符(多行仍然有效),但下一个字符不再转义

echo #5 Line1< nul ^
& echo Line2
echo#5行1
因此,您也可以使用它来构建多行命令

call openfiles.cmd < nul ^
"C:\dir with spaces\file with spaces.txt" < nul ^
"C:\another dir with spaces\another file with spaces.txt"
调用openfiles.cmd
或者使用宏

set“\n=
简而言之:

字符必须是
^
转义的
,否则cmd会逐字复制
^
出现在
对之间的
字符

警告
^
复制插入符号后面的字符,使其失去任何元字符功能(如果有)。在多行场景中,不仅换行符/换行符被逐字复制,而且新行中的第一个字符也被转义

说明:

插入符号元字符 下面的定义是从文章的一个小节复制而来的

更好的引用方法 而
元字符不能完全保护我们的系统中的元字符 针对意外shell解释的命令行,
^
元字符可以。当cmd转换命令行并看到一个
^
时,它会忽略^character本身,并将下一个字符复制到新命令行,不管是否为元字符。
这就是为什么
^
用作行延续字符的原因:它告诉cmd复制后续行 换行符本身,而不是将该换行符视为命令 终止符。如果我们在参数中的每个元字符前面加上
^
字符串,cmd将该字符串转换为我们想要使用的字符串

现在,对于与所提出问题相关的重要部分:

还必须
^
-转义
字符
:否则,cmd会逐字复制
^
两个
对之间出现的字符,从而在过程中损坏参数字符串

请注意当您
^“
时,
将失去其引用功能,因此必须小心


演示:
^
-转义

"c:\Program^
 Files\test.bat"
^"c:\Program^
 Files\test.bat^"
变成

"c:\Program^
Files\test.bat"
^
-转义

"c:\Program^
 Files\test.bat"
^"c:\Program^
 Files\test.bat^"
变成

"c:\Program Files\test.bat"
"c:\Program Files\test.bat"
并执行程序

请注意,
^
-对引号进行转义会使引号失去其引用功能,因此此命令也可以按以下方式执行:
c:\Program^Files\test.bat
。我们通常将其置于引号中的原因是为了删除空格元字符的定界功能,但对空格字符进行插入符号转义会提供相同的功能理性

带有
^
-转义
,但空格移动到前一行

^"c:\Program ^
Files\test.bat^"
变成

"c:\Program Files\test.bat"
"c:\Program Files\test.bat"
但是命令行报告“c:\Program”无法识别…

这是因为第一行有空格字符和转义的
字符
^
,因此
被解释为分隔符,而不是字符

在第二个示例中,
是新行中
^
后面的第一个字符,因此转义并解释为字符而不是分隔符


资料来源:

考虑在上面的示例中尝试,我在双引号前面有额外的空格。原来的双引号似乎没有解决我的问题。它失败了,因为引号被转义,因此空格可以将文件名分成更小的部分“dubble”“是我最喜欢的新单词。记事本++说,当我查看->符号->显示所有字符时,我的行尾是CR-LF,所以仍然不知道为什么空格有助于我哦,的确,我可以复制。问题是,我从来没有想过在不缩进的情况下使用续行(通常是用制表符)……你解决的问题是,空格不仅转义了
换行符,而且转义了换行符后的第一个字符,因此你的第一个
被解释为字符而不是引号,第二行末尾的引号引用了
^
字符,使其失去功能。通过在第二行的开头添加空格,第一行