在整个目录上执行操作时是否可以跳过子目录?

时间:2013-04-28 10:28:34

标签: batch-file move skip

所以我有这个代码用于在主目录中的子目录中复制文件:

@ECHO OFF
SETLOCAL

SET relroot=g:\Pictures\Uda 18
(SET relroot=g:\Pictures\Uda 18)
SET "relroot=g:\Pictures\Uda 18"

SET "destdir=g:\Pictures\Uda 18\Sets"

:again
(SET artist=)
SET /p artist="Artist? "

IF NOT DEFINED artist GOTO :eof

MD "%destdir%\%artist%" 2>nul

FOR /f "delims=" %%i IN ( 
   ' dir /s /b /a-d "%relroot%\*%artist%*" '
   ) DO (
>>undo.txt ECHO %%i^|%destdir%\%artist%\%%~nxi
MOVE "%%i" "%destdir%\%artist%\%%~nxi" >nul)
)

GOTO again

它接受一个输入,搜索目录'Uda 18'及其中的所有内容,并将所有带有名称输入的文件移动到以'Uda 18 / Sets'目录下的输入命名的文件夹中。然而,粗心测试使我从'Uda 18 / Sets'中提取文件,其名称意味着他们无法使用批次进行重组。为了避免这种情况,我需要从文件的取处中排除'Uda 18 / Sets',但我找不到办法。所以标题要求;是否可以跳过select子目录,若然,怎么做?

4 个答案:

答案 0 :(得分:0)

尝试使用此方法绘制文件名,但“sets”文件夹中的文件名除外:

dir /b /s /a-d "uda 18" | find /v /i "sets"

...以及您的文件夹:

echo "%destdir%\%artist%" | find /v /i "sets" >nul && goto:createFolder || goto:eof

答案 1 :(得分:0)

就个人而言,我更喜欢创建目的地目录BESIDES源目录,而不是:

source:        g:\pictures\uda 18\xxx
destination:   g:\pictures\sorted\uda 18\xxx

这样你不仅可以避免这个问题,而且还会有一个清晰一致的目录结构

答案 2 :(得分:0)

我也会将目标文件夹与要处理的文件夹分开。

将它移出并稍后移回它是一个选择。

move "g:\Pictures\Uda 18\Sets" "g:\Pictures"
do your other commands here
move  "g:\Pictures\Sets" "g:\Pictures\Uda 18"

答案 3 :(得分:0)

FOR /f "delims=" %%i IN ( 
   ' dir /s /b /a-d "%relroot%\*%artist%*" ^|findstr /v /i /b /c:"%destdir%\\"'
   ) DO ( ECHO MOVE "%%i" "%destdir%\%artist%\%%~nxi")

应列出要执行的MOVE /v排除任何目录/b开始/i不区分大小写/c:整个字符串包括空格...其中{{1} } escapes \因此排除“g:\ Pictures \ Uda 18 \ Sets”及其任何子目录(完整文件名将从\开始

只需删除g:\Pictures\Uda 18\Sets\"即可选择/v ONLY及其子目录中的匹配文件。