在列表上循环(工作)批处理文件

时间:2014-04-25 17:21:38

标签: batch-file cmd

我有这个漂亮的批处理文件我已经从互联网上获得了很多帮助。它的作用是查看我的源目录,并将它找到的所有* .pst文件复制到dest目录中。它保留了文件夹结构,但将扩展名从pst更改为myMail。

@echo off
setlocal enabledelayedexpansion

set SOURCE_DIR=c:\PST\Exchange Folder\
set DEST_DIR=U:\testPST\
set FILENAMES_TO_COPY=*.pst

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set d=%%~dpa
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        if not exist "%DEST_DIR%!FILE_INTERMEDIATE_DIR!" (
            mkdir "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
        )
        COPY /y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!%%~nF.myMail"
    )
)

这很有效,但我想添加一种方法来轻松添加新的源文件夹。例如,如果我有4个可能存放我希望脚本工作的pst文件的地方怎么办?我查看了列表,但我认为目录路径中的空格给了我一些问题。

我希望我可以做类似以下的事情,我在顶部添加一个列表,并基本上将我现有的大部分代码粘贴到一个额外的循环中。

@echo off
setlocal enabledelayedexpansion
set DEST_DIR=U:\testPST\
set FILENAMES_TO_COPY=*.pst

set list="c:\PST\Exchange Folder" "c:\users\auser\documents\mail" 
(
    for %%i in (%list%) do (
        set SOURCE_DIR=%%i
        for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
            if exist "%%F" (
                set d=%%~dpa
                set FILE_DIR=%%~dpF
                set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
                if not exist "%DEST_DIR%!FILE_INTERMEDIATE_DIR!" (
                    mkdir "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
                )
                COPY /y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!%%~nF.myMail"
            )
        )
        )
    )
)
PAUSE

无论如何,这就是我所处的阶段 - 有没有人有任何好主意?

2 个答案:

答案 0 :(得分:2)

您可以处理此问题的一种方法是将DEST_DIR从字符串更改为%1,然后再创建另一个批处理文件

call foo.bat "c:\source_1"
call foo.bat "c:\source_2"

答案 1 :(得分:1)

如果你改变了

    for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (

    for /R "%%~i" %%F IN (%FILENAMES_TO_COPY%) do (

            set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!

            set FILE_INTERMEDIATE_DIR=!FILE_DIR:%%~i=!

然后至少在理论上,你的目标可以实现。

问题在于使用%var%!var!。前者表示遇到整个var语句时FOR..%%i..的值(直到其右括号) - (即“分析时间”值)。第二个意思是'var的值,因为它在循环中变化'(即“运行时”值)

%%x - 元变量(循环控制变量)x的值始终是运行时值。预设的~表示(在这种情况下)“删除封闭的引号”