说我在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扩展名。我确信这是一种更有效的方法,但它完成了我现在需要做的事情。
答案 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.txt
和BETA #102.txt
都存在,会发生什么?