【问题标题】:Is it possible to skip over a subdirectory when performing an operation over an entire directory?对整个目录执行操作时是否可以跳过子目录?
【发布时间】:2013-04-28 10:28:33
【问题描述】:

所以我有这段代码用于在主目录的复杂子目录中对文件进行排序:

@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”,但我找不到方法。正如标题所要求的那样;是否可以跳过选择子目录,如果可以,如何?

【问题讨论】:

    标签: batch-file move skip


    【解决方案1】:

    就个人而言,我更喜欢在源目录之外创建一个目标目录,而不是在:

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

    这样你不仅可以避免这个问题,你也将始终拥有清晰一致的目录结构

    【讨论】:

    • 我希望能够在不改变文件夹排列方式的情况下进行排序。
    【解决方案2】:

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

    不过,将其移出并稍后移回是一种选择。

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

    【讨论】:

    • 我认为这是可能的,但出于某些原因,我发现我的偏好在于在整个过程中保持文件夹结构不变。
    • SETS 文件夹有子文件夹吗?文件夹树中的名称集是否还有其他可能的文件夹?
    【解决方案3】:
    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: 包括空格在内的整个字符串...其中\ 转义 \ 因此排除“g :\Pictures\Uda 18\Sets" 及其任何子目录(完整文件名将以 g:\Pictures\Uda 18\Sets\" 开头的位置@

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

    【讨论】:

    • 这里的问题是findstr.exe位于我的C:\驱动器中,而正在组织的批处理+文件夹都在我的G:\驱动器上。我将不得不将它全部重定向到我的 findstr.exe 的位置,但这将导致批处理尝试在那里执行所有操作,而不是指定的目录(并且在测试时做了)。将 findstr.exe 放在我的 G:\ 驱动器上也没有解决问题。
    • findstr.exe 应该在c:\windows\system32c:\windows\syswow64 中的另一个版本(如果您运行的是 64 位。)无论它在哪里,您的 PATH(这是一个分号分隔的目录列表) 应包括该目录。 path 是 Windows 查找(按顺序)以查找不在当前目录中的任何可执行文件的目录列表。 findstr 正在处理仅存在于内存中的 "file"dir 命令的输出)。
    【解决方案4】:

    尝试绘制除“sets”文件夹之外的文件名:

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

    ...以及您的文件夹:

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

    【讨论】:

    • 那没用;文件夹已创建,但未触及任何文件,然后窗口自行关闭。
    • 这不会创建任何文件夹。它显示“uda 18”子文件夹中的所有文件,“Sets”中的文件除外。
    • 不仅仅是这部分,而是在批次的其余部分中,通常会制作的文件夹已制作但文件未处理。
    • 好的,现在我知道了,你们是什么人(希望 :))并增强了我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多