2013-11-21 41 views
1

我需要將某個文本文件中指定的某些文件移動到另一個不同文本文件中指定的目錄。使用批處理命令。批處理將文本文件中指定的文件移動到文本文件提供的目錄

我試過了。

@echo off 
echo. 
REM check if file is there 
if exist K:\file_sync_diff\FileNameList.txt goto Label 1 
REM display error 
echo Can not find the File Name List 
echo. 
echo. 
Pause 
goto :eof 

:Label 1 
REM display that the file in the last check was found 
echo found FileNameList.txt 
REM check if file is there 
if exist K:\file_sync_diff\FileDumpText.txt goto Label 2 
REM display error 
echo Can not find File Dump Text File 
echo. 
echo. 
Pause 
goto :eof 

:Label 2 
REM display that the file in the last check was found 
echo found FileDumpText.txt 
REM check if file is there 
if exist K:\file_sync_diff\DirectoryNames.txt goto Label 3 
REM display error 
echo Can not find Directory Names Text File 
echo. 
echo. 
Pause 
goto :eof 

:Label 3 
REM display that the file in the last check was found 
echo found DirectoryNames.txt 
REM for loop to filter through every line in a file 
echo. 
for /f %%i in (K:\file_sync_diff\FileNameList.txt) do call :Sub %%i 
goto Label 4 
goto :eof 

:Label 4 
REM display message of the file being moved 
echo. 
echo Moving %1 
REM copy the file just made to a directory with a name supplied in a text file 
for /f %%i in (K:\file_sync_diff\DirectoryNames.txt) do call :Sub 2 %%i 
echo. 
goto :eof 

:Sub 
echo Writing %1 
REM copy the contents of FileDumpText.txt to the file that was passed in the last method 
type K:\file_sync_diff\FileDumpText.txt >> %1.txt 
goto :eof 

:Sub 2 
REM moves the file to the directory supplied by label 4. 
move /y %1.txt %1 
echo. 
goto :eof 

內容的DirectoryNames.txt

K:\file_sync_diff\cat 
K:\file_sync_diff\dog 
K:\file_sync_diff\333 

這不是問題FileNameList.txt

red 
orange 
purple 

內容,但FileDumpText.txt
測試文字的內容傳送到文件

more text 1 
more text 2 
more text 3 

這些目錄確實存在於K:\file_sync_diff文件夾中。

謝謝你的幫助。

最終的結果應該與red.txt以下 目錄裏面的貓所有的FileDumpText.txt的內容裏面 目錄狗orange.txt裏面所有的FileDumpText.txt的內容裏面 目錄333與所有的FileDumpText.txt內容purple.txt裏面裏面

+0

這將使要解決的問題,如果你刪除了所有多餘的代碼,並將其簡化爲一個for循環,只是試圖讀取文件列表和呼應的文件名要容易得多,然後從那裏建起來。 –

回答

0

我成功地使用下面的代碼,但有一個問題。我現在得到一個「.txt」文件。這是由FileNameList.txt文件中的返回章程引起的,但如果它們在FileNameList.txt中的最後一個文件名之後沒有返回,那麼該文件不會被複制。 所以我只需要一行代碼來刪除「.txt」,而不是其他任何具有實際name.txt的文件。任何幫助都可以。

我當前的代碼

@echo off 
echo. 
REM check if file is there 
if exist F:\file_sync_diff\FileNameList.txt goto Label 1 
REM display error 
echo Can not find the File Name List 
echo. 
echo. 
Pause 
goto :eof 

:Label 1 
REM display that the file in the last check was found 
echo found FileNameList.txt 
REM check if file is there 
if exist F:\file_sync_diff\FileDumpText.txt goto Label 2 
REM display error 
echo Can not find File Dump Text File 
echo. 
echo. 
Pause 
goto :eof 

:Label 2 
REM display that the file in the last check was found 
echo found FileDumpText.txt 
REM check if file is there 
if exist F:\file_sync_diff\DirectoryNames.txt goto Label 3 
REM display error 
echo Can not find Directory Names Text File 
echo. 
echo. 
Pause 
goto :eof 

:Label 3 
REM display that the file in the last check was found 
echo found DirectoryNames.txt 
REM for loop to filter through every line in a file 
echo. 
for /f %%i in (F:\file_sync_diff\FileNameList.txt) do call :Sub %%i 
goto Label 4 
goto :eof 

:Label 4 
REM thanks to [email protected] 
@ECHO OFF &SETLOCAL 
REM set associative arrays 
set "tfileA=F:\file_sync_diff\FileNameList.txt" 
set "tfileB=F:\file_sync_diff\DirectoryNames.txt" 
REM setup for loops 
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileA%"') do set "$a%%a=%%b"&set /a countA=%%a 
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileB%"') do set "$b%%a=%%b"&set /a countB=%%a 

SETLOCAL ENABLEDELAYEDEXPANSION 
for /l %%a in (1 1 %countA%) do (
    echo. 
    move "!$a%%a!.txt" "!$b%%a!" 
    echo. 
    echo ^>"!$b%%a!\!$a%%a!" echo(!$c%%a!) 
    echo. 
endlocal 

:Sub 
echo Writing %1 
REM copy the contents of FileDumpText.txt to the file that was passed in the last method 
type F:\file_sync_diff\FileDumpText.txt >> %1.txt 
goto :eof 
0

我的建議與associative arrays

@ECHO OFF &SETLOCAL 
set "tfileA=K:\file_sync_diff\FileNameList.txt" 
set "tfileB=K:\file_sync_diff\DirectoryNames.txt" 
set "tfileC=K:\file_sync_diff\FileDumpText.txt" 

for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileA%"') do set "$a%%a=%%b"&set /a countA=%%a 
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileB%"') do set "$b%%a=%%b"&set /a countB=%%a 
for /f "tokens=1*delims=:" %%a in ('findstr /n $ "%tfileC%"') do set "$c%%a=%%b"&set /a countC=%%a 
if "%countA%"=="%countB%" (echo %countA% line(s^) found in %tfileA% and %tfileB%.) else echo Line mismatch: %tfileA%:%countA% - %tfileB%:%countB%&goto:eof 
if "%countA%"=="%countC%" (echo %countA% line(s^) found in %tfileC%.) else echo Line mismatch: %tfileA%:%countA% - %tfileC%:%countC%&goto:eof 

SETLOCAL ENABLEDELAYEDEXPANSION 
for /l %%a in (1 1 %countA%) do (
    echo copy "!$a%%a!" "!$b%%a!" 
    echo ^>"!$b%%a!\!$a%%a!" echo(!$c%%a! 
) 
endlocal 

輸出是:

 
3 line(s) found in K:\file_sync_diff\FileNameList.txt and K:\file_sync_diff\DirectoryNames.txt. 
3 line(s) found in K:\file_sync_diff\FileDumpText.txt. 
copy "red" "K:\file_sync_diff\cat" 
>"K:\file_sync_diff\cat\red" echo(more text 1 
copy "orange" "K:\file_sync_diff\dog" 
>"K:\file_sync_diff\dog\orange" echo(more text 2 
copy "purple" "K:\file_sync_diff\333" 
>"K:\file_sync_diff\333\purple" echo(more text 3 
相關問題