【问题标题】:Create Folders based on part of file name and move files into the created folder根据部分文件名创建文件夹并将文件移动到创建的文件夹中
【发布时间】:2020-06-29 10:11:13
【问题描述】:

我绝对不是开发人员,我需要您的帮助。我在这个网站上环顾四周,发现了一些我认为可以满足我需求的例子,但它实际上并不起作用。 First example 或另一个Second Exapmle 我创建了这个测试批处理文件:

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\Test_Directory"
PUSHD %sourcedir%
FOR /f "tokens=1* delims=-" %%a IN (
 'dir /b /a-d "*.pb*"'
 ) DO (  
 ECHO MD %%a
 ECHO MOVE "%%a-%%b" .\%%a\
)
POPD
GOTO :EOF

我为测试目的创建了以下文件:

  • 777 在这个我没有delimiter.pb4
  • 现在任何简单且不难解决的问题 - 我们去吧.pb4
  • 现在任何简单且不难解决的问题 - 我们去吧.pb5
  • 可能也是 (The) - Something-like-this.pb4
  • 甚至更糟 - 怎么办.pb
  • 示例 - Easy.pb
  • 假的,文件 - 又一个.pb4
  • 这里,那里 - 我不知道该怎么办.pb3
  • 这里,那里-whatever.pb3
  • 第一个 1 - 这里的其他内容 (2).pb4
  • 这第一个 1 - 这里的其他东西.pb4
  • 这一招也一样 777 因为没有 delimiter.pb3

我有一个分隔符“-”。我需要创建一个文件夹,该文件夹的名称与 3 个字符分隔符之前的名称相同,并将所有以与分隔符之前的名称相同的名称开头的文件移动到该文件夹​​。

现在第一个问题是'delims' 只接受一个字符。我有3个怎么办?

第二个问题是在某些文件中这种模式“ - ”不存在。然后必须将文件移动到名为“0-TBC”的目录中。

第三个问题是当我在文件名中只有一个“-”字符时,它与我正在寻找的模式不匹配。在这种情况下,我应该找到该模式,如果它不在文件名中,那么该文件也应该移动到“0-TBC”文件夹中。

第四个问题是,当我运行上面的批处理文件时,显示的结果很好(除了它没有解决上面的两个问题)。然而,当我删除“MD”命令前面的“ECHO”时,它会将空格作为分隔符而不是“-”字符,因此它绝对不会做预期的事情。

抱歉,拖了这么久。非常感谢您的热心帮助。

【问题讨论】:

    标签: windows batch-file directory-structure


    【解决方案1】:

    您可以将字符串 SPACE + - + SPACE 替换为文件名中不能出现的单个字符,例如 |,例如:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Change into root directory:
    pushd "C:\Test_Directory" && (
        rem // Loop through all matching files:
        for /F "delims= eol=|" %%F in ('
            dir /B -A:-D-H-S "*.pb*"
        ') do (
            rem // Store current file name:
            set "FILE=%%F"
            rem // Toggle delayed expansion to avoid troubles with `!`:
            setlocal EnableDelayedExpansion
            rem // Replace ` - ` by `|` and split file names there:
            for /F "tokens=1* delims=| eol=|" %%I in ("!FILE: - =|!") do (
                endlocal
                rem // Check file name:
                if "%%J"=="" (
                    rem // File name contains no ` - `:
                    ECHO md "0-TBC" 2> nul
                    ECHO move "%%F" "0-TBC\"
                ) else (
                    rem // File name does contain `|`:
                    ECHO md "%%I" 2> nul
                    ECHO move "%%F" "%%I\"
                )
            )
        )
        rem // Return from root directory:
        popd
    )
    
    endlocal
    exit /B
    

    【讨论】:

    • 非常感谢。我正在测试它,会告诉你。非常感谢您的帮助!
    • 再次感谢!太棒了 !它确实完美地完成了这项工作......物超所值!
    • 不客气!请考虑阅读this...
    • @jim 如果此答案解决了您的问题,建议您选择它作为正确答案。它不仅为提供答案的人提供了他们应得的声誉,而且还有助于帮助未来有类似问题的用户通过找到最相关的答案来纠正他们的问题。您可以通过选择答案旁边的灰色 rick 标记来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多