2015-02-23 19 views
0

我有一個文件目錄和一個單獨的目錄,文件夾的名稱與文件名的子字符串相對應。我試圖在文件列表中進行循環,每個文件都有一個具有相應子字符串名稱的文件夾,並將文件的一個副本存入其中。如果沒有相應的文件夾,我需要將該文件忽略。這不能在批處理文件中完成,它需要在命令提示符下完成。For循環複製命令提示符中的文件,使用子字符串命名每個文件的目標位置(帶有延遲擴展)

我具有我的指揮

for /f %I in ('dir /b J:\test\test_audio\en * ^| find ".wav"') do (
set var=I 
copy J:\test\test_audio\en\%~I J:\test\test_designed_locations\%var:~0,5%\ 
) 

最初的反應是The syntax of the command is incorrect這個問題,因爲我覺得命令的擴展的順序。

.... 
C:\Windows\System32>(
set var=Ev164_en.wav 
copy J:\test\test_audio\en\Ev164_en.wav J:\test\test_designed_locations\%var:~0,5%\ 
) 
The syntax of the command is incorrect 

C:\Windows\System32>(
set var=Ev178_en.wav 
copy J:\test\test_audio\en\Ev178_en.wav J:\test\test_designed_locations\%var:~0,5%\ 
) 
The syntax of the command is incorrect 
... 

這也可以解釋爲什麼在運行命令第二次創建其中從最後一個文件子中的所有命令使用,引起其他人在最後一個文件夾來存放所有的文件,並沒有任何的情況。

.... 
for /f %I in ('dir /b J:\test\test_audio\en * ^| find ".wav"') do (
set var=I 
copy J:\test\test_audio\en\157_en.wav J:\test\test_designed_locations\Ev225\ 
) 
    1 file(s) copied. 
for /f %I in ('dir /b J:\test\test_audio\en * ^| find ".wav"') do (
set var=I 
copy J:\test\test_audio\en\158_en.wav J:\test\test_designed_locations\Ev225\ 
) 
    1 file(s) copied. 
.... 

我懷疑我需要使用延遲擴展停止正在處理中,使用前互相覆蓋的環境變量。我試着在命令開始加入setLocal enableDelayedExpansion和包裝的參考變量劉海

setLocal enableDelayedExpansion 
for /f %I in ('dir /b J:\test\test_audio\en * ^| find ".wav"') do (
set var=%I 
copy J:\test\test_audio\en\%~I J:\test\test_designed_locations\!var:~0,5!\ 
) 

帶或不帶逗號前的一種逃避,我得到

.... 
C:\Windows\System32>(
set var=Ev164_en.wav 
copy J:\test\test_audio\en\Ev164_en.wav J:\test\test_designed_locations\!var:~0,5!\ 
) 
The syntax of the command is incorrect. 
.... 

變量ISN沒有爲它的價值進行處理。我開始懷疑是否真的有可能循環遍歷所有文件,並使用每個文件名中的子字符串來標識將文件放在哪裏,全部放在一個命令中。任何幫助非常感謝。

回答

0
cmd /v /q /c "pushd "j:\test\test_audio\en" && (for %a in (*.wav) do (set "I=%~nxa" & if exist "!I:~0,5!\" copy "%a" "!I:~0,5!") & popd)" 

只有在啓用cmd實例時才能使用命令行中的延遲擴展。

編輯適應評論

pushd "j:\test\test_audio\en" && (for %a in (*.wav) do (set "I=%~nxa" & call pushd ^"%I:~0,5^%^" 2>nul &&(copy "%~fa" & popd)) & popd) 

好,它可以在不啓動一個單獨的cmd實例來啓用延遲擴展來實現,但需要逃避使用call強制的第二語法分析器分析這條線不是很明顯。

+0

謝謝@MC ND。大概啓用帶有延遲擴展的cmd實例的參數?這在初始參數中沒有提供給我,但可能可用。這是否意味着如果我不使用延遲擴展,則在命令行中無法解決此問題?我的工作是與別人的程序集成,我在問題中列出的是他們給我的參數。我現在想知道是否有解決這個給定的當前參數的方法,或者我是否需要回去與其他人重新協商。 – gianthair 2015-02-24 09:59:13

+0

@ gianthair,回答已更新。解析器刪除代碼塊中的讀取操作,用代碼中的值替換它們。如果一個變量在塊內部改變了它的值,那麼當讀取操作被刪除時,你不能檢索到改變的值。您需要延遲擴展,或者對轉義字符串使用'call'命令來強制執行第二個解析器評估。還有另外一種方法,如果文件名可以用下劃線分割,使用一個附加的for/f來處理分割,但是我不知道是否是這種情況。 – 2015-02-24 10:43:06

相關問題