使用通配符路径重命名文件

gei*_*aos 5 batch-file batch-rename batch-processing

最近我开始工作,我的第一个任务是编写一个批处理文件,该文件自动将文件名更改为带有原始文件结尾的 filename_date。为此,您应该能够将路径写入文本文件(例如,paths.txt),并且当您启动程序时,它应该从那里获取任何行(=path->file)并重命名它。我让它在我的电脑上安静地工作,但当我把它交给测试时,他们要求使用通配符成为Z:\Path\*.*可能。我当前的代码如下所示:

@echo off
setlocal EnableDelayedExpansion
cd %~dp0    

For /F "tokens=*" %%m in (paths.txt) do (

set path=%%~dpm
set name=%%~nxm

pushd "!path!"
dir

For /r !path! %%f in (!name!) do (

set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf

set "name=!name!_"
set "name=!name!!date:~6,4!"
set "name=!name!!date:~3,2!"
set "name=!name!!date:~0,2!"

set "name=!name!!ending!"

copy "!datsave!" "!name!"

del "!datsave!"
cls
popd
)

)
Run Code Online (Sandbox Code Playgroud)

我知道很多事情可能更容易、更有效,但这是我的第一批项目,除了通配符问题外,我很高兴。所以一个例子是: C:\Some\Path\*.*

这一行将在paths.txt 中。随着分裂

set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf
Run Code Online (Sandbox Code Playgroud)

我得到以下信息:

path: C:\Some\Path
name: C:\Some\Path
ending: -empty-
datsave: C:\Some\Path
Run Code Online (Sandbox Code Playgroud)

因为 name 设置为第一个 FOR 循环开始时的 Path。但如果我不使用通配符,这似乎有效。

现在的问题是:为什么会发生这种情况,我该如何摆脱它?还是我只是使用了错误类型的通配符?

再说一遍:这是我第一次使用批处理,所以它可能很简单;)

gei*_*aos 1

Weeeeell 首先再次感谢 @Jean-Fran\xc3\xa7ois Fabre 和 @aschipfl 对我的耐心:)\n在第二个批处理文件的提示之后,我必须测试一些东西,因为并非一切都正常,但是现在一切都很好!

\n\n

主文件代码:

\n\n
@echo off\nsetlocal EnableDelayedExpansion\ncd %~dp0\nset DEPTH=20\n\nFor /F %%m in (paths.txt) do (\npause\nset pth=%%~dpm\n\n  REM pushd !pth!\n  REM set origpth=!cd!\n  REM popd\n\nset z=%%m\nset name=!z!\n\nFor /L %%i in (1,1,%DEPTH%) do set \nname=!name:*\\=!\nset chkname=!name:*\\=!\nif not !chkname!==!name! ( echo depth to small\npause\nexit /B)\n\nrem set name=%%~nxm\npushd "!pth!"\n\nFor /r . %%f in (!name!) do (\n\npushd %~dp0\ncall renamefiles.bat %%f REM "!origpth!"\npopd\n)\n\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及子文件的代码:

\n\n
@echo off   \n\n  REM set pth=%~dp1\n  REM set origpth=%2\n  REM set origpth=%origpath:"=%\\\n\n  REM If !pth!==%origpth% (\n\nset path=%~dp1\nset name=%~n1\nset ending=%~x1\nset datsave=%~nx1\n\npushd !path!\n\nset "name=!name!_!date:~6,4!!date:~3,2!!date:~0,2!!ending!"\n\npause\n\necho renaming "!datsave!" to "!name!"\nrem "!datsave!" "!name!"\n\ncls\npopd\n\n  REM )\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:经过一番测试后,我想,子文件夹也包含在内!我在两个标有 REM 和两个额外空格的代码中添加了额外的代码。删除那些 REM,重命名时程序将不再包含子文件夹:)

\n