我有这个漂亮的批处理文件我已经从互联网上获得了很多帮助。它的作用是查看我的源目录,并将它找到的所有* .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
无论如何,这就是我所处的阶段 - 有没有人有任何好主意?
答案 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
的值始终是运行时值。预设的~
表示(在这种情况下)“删除封闭的引号”