2017-10-20 185 views
0

我有以下for命令如何报价空间在“FOR/F”循环的命令在Windows

for /F %s in ('"mas ter\gradlew.bat" -q -p mass ter') do echo %s 

我不让它正常工作。这不是实际的用例,而是一个非常简单的例子。

执行

"mas ter\gradlew.bat" -q -p "mas ter" 

工作正常,

"mas ter\gradlew.bat" -q -p mass ter 

说,该项目direcotry “质量” 不存在(额外的 “s” 是唯一distinguisihing目的),

mas ter\gradlew.bat -q -p mass ter 

说没有找到命令“mas”。

到目前为止这么期待,但现在我想让它在for循环中工作。

for /F %s in ('mas ter\gradlew.bat -q -p mass ter') do echo %s 
当然

再次说命令“MAS”没有被发现,

for /F %s in ('"mas ter\gradlew.bat" -q -p mass ter') do echo %s 
当然

再次表示,项目direcotry“质量”不存在,但现在它来了,

for /F %s in ('"mas ter\gradlew.bat" -q -p "mass ter"') do echo %s 

再次表示未找到命令“mas”。 o_O

现在我在跆拳道。
为什么会发生这种情况,我该如何使它工作?
它也不能用于逃避^字符的空格。
除此之外,这不会帮助,因为这两条路径都存储在参数和使用像

for /F %s in ('"%script_path%\gradlew.bat" -q -p "%script_path%"') do echo %s 

回答

1

这真是一个令人沮丧的,因为命令的解析是怪异

('"mas ter\gradlew.bat" -q -p mass ter') 

但是你不能在第一和任何其他PARAM双引号

('"mas ter\gradlew.bat" -q -p "mass ter"') 

下面的东西会工作得很好

('master\gradlew.bat -q -p mass ter') 

所以我用这个几件事情来上班

面值ams.bat

与空间的文件名和呼应参数。我还创建相同的副本params.bat

@echo off 
echo "You sent '%*'" 
set argC=0 
for %%x in (%*) do (
    Set /A argC+=1 
    echo %argC% is %%x 
) 
echo %argC% 

F:\params.sh>"par ams.bat" 1 2 "ab c" 
"You sent '1 2 "ab c"'" 
0 is 1 
0 is 2 
0 is "ab c" 
3 

我没有打扰大约只要固定参数指标作为最终计数显示我一切

现在一个文件来测试设置

@echo off 

for /F "tokens=* delims=" %%s in (params.bat " -q" " -p " "abc"`) do echo %%s 

这个伟大的工作

"You sent '" -q" " -p " "abc"'" 
0 is " -q" 
0 is " -p " 
0 is "abc" 
3 

下一步是尝试par ams.bat。我尝试了不同的变化

for /F "tokens=* delims=" %%s in ('par ams.bat " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims=" %%s in ('"par ams.bat" " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims=" %%s in ('par ams.bat' " -q" " -p " "abc"') do echo %%s 
for /F "tokens=* delims= usebackq" %%s in (`'par ams.bat' " -q" " -p " "abc"`) do echo %%s 
for /F "tokens=* delims= usebackq" %%s in (`"par ams.bat" " -q" " -p " "abc"`) do echo %%s 

而上述都没有工作。所以结论是,第一个参数没有空格,然后是任何带空格或引号的参数,没有问题。所以,我想出了一个额外的批处理文件

escape.bat

@echo off 
SET COMMAND=%~1 
SHIFT 
%COMMAND %%* 

文件不执行任何操作,但需要第一个参数是什么,对于相同的执行,然后命令行参数。现在我更新了测试中使用的

for /F "tokens=* delims=" %%s in ('escape.bat "par ams.bat" " -q" " -p " "abc"') do echo %%s 

然后它的工作

F:\params.sh>test 
"You sent '" -q" " -p " "abc"'" 
0 is " -q" 
0 is " -p " 
0 is "abc" 
3 

编辑-1:使用替代escape.bat呼叫

感谢这个反馈@吸血鬼。所以更好的方法是使用call而不是escape.bat。您也可以使用set script_dir=%~dp0获取脚本目录,然后在批处理文件中使用相同的脚本。因此,我们将改变

for /F "tokens=* delims=" %%s in ('escape.bat "par ams.bat" " -q" " -p " "abc"') do echo %%s 

set script_name=%~dp0 
for /F "tokens=* delims=" %%s in ('call "%script_name%\par ams.bat" " -q" " -p " "abc"') do echo %%s 
+0

感谢您的反馈@Vampire,那么很可能,为什么不使用'设置SCRIPT_DIR =%〜sdp0'得到8.3名,然后无需呼也? –

+0

一个现在被删除的问题还提出了8.3个名字,不幸的是他们可以被停用,即使他们被激活,只有新创建的路径才能得到一个。对我来说e。 G。 C有他们激活,D停用,我没有故意这样做。所以使用8.3名称并不是非常安全的。否则,这将是一个有效的解决方案,因为那样你永远不需要在命令周围引用引号。 – Vampire