2017-10-20 186 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