通过批处理脚本删除文件名中分隔符后的所有内容

时间:2017-11-13 17:50:01

标签: windows batch-file cmd batch-rename

说我在Windows的“Files”目录中有一组文件,批处理脚本和子目录“Numbers”和“NoNumbers”,如下所示:

<Files>
    <Numbers>
    <NoNumbers>
    updatefiles.bat
    Alpha.txt
    Alpha #306.txt
    Beta.txt
    Gamma.txt
    Gamma #402.txt
    Epsilon.txt
    Epsilon #862.txt

我希望将包含#XXX的所有文件移动到子目录“Numbers”中,将所有不包含#XXX的文件移动到子目录“NoNumbers”

移动后,我想删除“Numbers”目录中文件的最后4个字符(例如,Alpha#306.txt重命名为Alpha.txt)。

我还想使用相对路径来完成所有这些操作(例如,“Files”目录可能位于任何Windows驱动器上的任何位置。)

最终结果如下:

<Files>
    <Numbers>
        Alpha.json
        Beta.json
        Gamma.json
        Epsilon.json
    <NoNumbers>
        Alpha.json
        Beta.json
        Gamma.json
        Epsilon.json

使用批处理脚本updatefiles.bat最简单的方法是什么?

谢谢!

编辑:这是我最初的尝试(试图先成功完成):

尝试将包含#的文件移动到子目录“Numbers”

ren *.txt *.json
for /f "eol=: delims=" %%F in ('dir /b^|find "#"') do move /Y "%%F" "Numbers"

试图切断最后4个字符和.txt扩展名:

for %%i in ("*.txt") do (set fname=%%i) & call :rename
goto :eof
:rename
::Cuts off last 9 chars
ren "%fname%" "%fname:~0,-9%.json"
goto :eof

现在我需要将它们组合成一个使用相对路径的.bat

编辑2:这就是我提出的组合脚本:

setlocal
ren *.txt *.json
for /f "eol=: delims=" %%F in ('dir /b^|find "#"') do move /Y "%%F" "Numbers"
for /f "eol=: delims=" %%G in ('dir /b^|find ".json"') do move /Y "%%G" "NoNumbers"
CD /D %~dp0\Numbers
for %%i in ("*.json") do (set fname=%%i) & call :rename
goto :eof
:rename
::Cuts off last 10 chars, then appends .json
ren "%fname%" "%fname:~0,-10%.json"
goto :eof

它将.txt重命名为.json,将所有包含“#”的.json文件移动到“Numbers”目录,将其他所有内容移动到“NoNumbers”目录,更改为“Numbers”目录,删除每个文件的最后10个字符,并添加.json扩展名。我确信这是一种更有效的方法,但它完成了我现在需要做的事情。

1 个答案:

答案 0 :(得分:0)

从您的示例结果看,您还希望将没有“#”的文件复制到NoNumber目录。这是对的吗?

此脚本通过将文件名与已将所有“#”字符替换为空的文件名进行比较来检测文件名中是否存在“#”字符。

SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%i IN ("*.txt") DO (
    SET "BNAME=%%~ni"
    SET "TNAME=!BNAME:#=!

    IF "!BNAME!" NEQ "!TNAME!" (
        REM A # was found
        REM NB: This assumes that there is a space before the #
        MOVE "%%~i" "NoNumbers\!TNAME:~0,-4!.json"
    ) ELSE (
        COPY /Y "%%~i" "NoNumbers\!BNAME!.json"
        MOVE "%%~i" "Numbers\!BNAME!.json"
    )
)

此脚本不会检测文件名冲突。如果BETA #101.txtBETA #102.txt都存在,会发生什么?