2013-03-11 42 views
1

我已經編寫了一個視頻轉換批處理,用戶可以簡單地將他的視頻從任何磁盤或分區拖放到批處理中,之後轉換後的視頻將保存在特定磁盤上的特定位置。如何應付批處理文件中%*的不一致文件名格式

的代碼看起來像這樣

@echo off 
%~d0 
cd %~p0 
for %%f in (%*) do ... 
pause 

實際的問題在於(%*)
當我的文件名稱中有一個結束圓括號時,批處理將不起作用。爲了解決這個問題,我使用了("%*"),但這不適用於名稱中包含空格的文件或多個文件。
我也試過(%~*)但這是無效的。

一些研究,我發現,當我把多個文件的批次名稱file(test)file test%*解析

file(test) "file test" 

這意味着一個文件名可能有引號,或沒有以後。 。

我的問題是:我該如何處理?
理想情況下,我想%*解析爲"file(test)" "file test"(這兩個名字引號包圍包裹)

+1

副作用:請注意,您可以使用'pushd%〜dp0'而不是'%〜d0' +'cd%〜p0'。一方面的好處是,如果你想回到你的原始文件夾,你可以在最後做一個'popd'。 – 2013-03-11 19:23:29

+0

或者'pushd',你可以使用'cd/d%〜dp0'。 – 2013-03-11 20:44:01

回答

5

而不是使用一個for循環的,你可以把每個參數,一次一個子程序。

:nextArgument 
set arg=%~1 
if not defined arg goto :eof 
call :processFile "%arg%" 
shift 
goto nextArgument 

:processFile 
set file=%~1 
echo "%file%" 
:: do your processing here 
goto :eof 

這將處理每個空間分隔參​​數(但引述參數可以包括空格)一次一個,將它們傳遞給processFile例程。我使用%~1首先從參數中刪除引號,然後在調用processFile時加入引號。這樣我知道什麼時候我得到processFile,一切都有引號。

+0

+1有趣的解決方案。但我會在接受之前等待其他答案,儘管(希望你明白)。 – Nolonar 2013-03-11 19:36:55

+0

我決定提前接受你的答案,因爲我很不耐煩;)而且,因爲我從這個答案中學到了很多東西,並且我的代碼比我的原始代碼更具可讀性(因爲'for'強迫我把我所有的電話都放在一條線上) – Nolonar 2013-03-11 19:58:01

+0

@Nolonar:它可能不是'for',它迫使你把所有的呼叫放在同一行,但可能你不知道多行語法。在循環體的周圍使用括號('()')。這將允許您將循環體的各個命令放在它們自己的行上,例如:for ... do(''command1' 'command2' ... ')''...'(關閉'''可以單獨行)。儘管如此,使用'goto'循環而不是'for'也有其好處,學習這種技術絕對不會受到傷害。 – 2013-03-11 20:56:25

相關問題