2011-12-06 70 views
2

我有循環,我將把所有* .txt文件複製到同一目錄中的big.txt。在每個循環步驟中,我希望在不同文件夾中的不同文件的副本與第一個目錄中文件的文件名中的前三個字符相同。使用批處理文件提取文件名的一部分

實施例:

\A\001.txt 
\A\003.txt 
\A\005.txt 
\A\big.txt 
\B\001_sth.xml 
\B\002_sth.xml - don't copy! no 002 in folder A 
\B\003_sth.xml 
\B\004_sth.xml - don't copy! no 004 in folder A 
\B\005_sth.xml 
\B\big.xml 

在步驟1:複製\ A \ 001.txt到\ A \ big.txt和\ B \ 001_sth.xml到\ B \ big.xml 等

我寫的批處理文件只能在目錄中的文件複製,但我不知道如何來查找文件目錄B.

@echo off 
if "%1"=="" goto error 
for %%x in (%1\A\*.txt) do (
    copy %%x %1\A\big.txt 
    echo %%x 
    echo --- 
) 

goto end  
:error 
echo give me a directory  
:end 

回答

3

爲什麼不枚舉一個文件,然後在B參考文件?

for %%I in (%1\A\*.txt) do (
    copy %1\B\%%~nI_sth.xml %1\B\big.xml 
    echo %%I 
    echo --- 
) 
goto :EOF 

(由它不是明智的做法是使用較低的情況下,x爲您的循環變量,因爲%%〜sdfnx都有着特殊的意義的方式)

+0

什麼是'%% x'?你的意思是'%%我'? –

+0

啊,我現在看到,它在那裏,因爲你用OP的例子作爲出發點。對於問愚蠢的問題感到抱歉。 –

+0

這就是我需要的:〜n。謝謝!還要感謝關於%% x的好建議。 – Borgo

2

我不明白你的代碼的目的。每次複製到big.txt時,都會覆蓋前一個副本。我想你想追加。

我不確定你是否想從一個空的big.txt和big.xml開始。我假設你這樣做。

另外,你的問題暗示的源文本文件可以有超過3個字符的名稱,即使你的例子恰好有3我假設你想支持超過3

如果我沒有理解你正確,我認爲這將工作(未經測試)編輯 - 所做的更改響應安德烈·M評論關於big.txt

@echo off 
setlocal disableDelayedExpansion 
if "%~1"=="" echo Give me a directory&exit /b 
set "root=%~1" 
if exist "%root%\A\big.txt" del "%root%\A\big.txt" 
if exist "%root%\B\big.xml" del "%root%\B\big.xml" 
for /f "delims=" %%F in ('dir /b "%root%\A\*.txt"') do (
    type "%root%\A\%%~F" >>"%root%\A\big.txt" 
    set "prefix=%%~nF" 
    setlocal enableDelayedExpansion 
    type "!root!\B\!prefix:~0,3!*.xml" >>"!root!\B\big.xml" 
    endlocal 
) 

內的延遲擴展的觸發初始SETLOCAL和避免自我複製循環僅在!出現在任何頁面中時才需要ATHS。由於這種情況不太可能發生,因此您可以先啓用延遲擴展並放棄切換。

+1

值得注意的是'big.txt'作爲'%% F'的值來防止自我複製的嘗試。 –

+0

我有一個問題:'setlocal'(沒有參數)意味着'setlocal DisableDelayedExpansion'? –

+0

對於大多數環境,沒有arg的SETLOCAL將等同於SETLOCAL DisableDelayedExpansion,但最好是明確的。我編輯了答案。該解決方案永遠不會嘗試自我複製big.txt,因爲它在啓動循環之前被刪除。 IN()子句在執行DO塊之前完全評估。 – dbenham

相關問題