最近,我开始工作,我的第一个任务是编写一个批处理文件,该文件会自动将文件名更改为filename_date并带有原始文件结尾。
为此,您应该能够将路径写入文本文件(例如,paths.txt),并且在启动程序时,它应该从此处取任意一行(= path-> file)并重命名。
我可以在安静的PC上正常运行它,但是在进行测试时,他们要求使用通配符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
)
)
我知道很多事情可能更容易,更有效,但这是我的第一个批处理项目,除了通配符问题之外,我非常高兴。
因此,一个例子是:
C:\Some\Path\*.*
该行将位于paths.txt中。
随着 split
set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf
我得到以下内容:
path: C:\Some\Path
name: C:\Some\Path
ending: -empty-
datsave: C:\Some\Path
因为名称是在第一个FOR-Loop的开头设置为Path的。但这似乎在我不使用通配符的情况下起作用。
现在的问题是:为什么会发生这种情况,我该如何摆脱呢?还是我使用的通配符类型错误?
再次:这是我第一次使用批处理,所以可能很简单;)
最佳答案
好的,我找出了2个问题,现在就可以了set name=%%~nxm
评估通配符。即使名称是*.txt
,它也将返回bar.txt
。
我用一个基名计算代替了它:set name=!name:*\=!
做了足够多次(不是很细微,但是批处理文件会迫使我们做这样的事情),这保留了通配符
另一个问题是for /R loop
:pushd
之后,参数必须是.
,否则将不被扫描。
最后一个未成年人:使用rename
代替copy
加delete
。它可以节省文件时间,而且速度非常快。复制然后删除大文件可能需要很长时间。
@echo off
set DEPTH=20
setlocal EnableDelayedExpansion
cd %~dp0
For /F %%m in (paths.txt) do (
set pth=%%~dpm
set z=%%m
set name=!z!
rem brutal basename. We cannot break the inner loop or
rem it would break the upper loop too
for /L %%I in (1,1,%DEPTH%) do set name=!name:*\=!
rem but we can check if it is really a basename
set chkname=!name:*\=!
if not !chkname!==!name! ( echo please increase DEPTH value
pause
exit /B)
rem set name=%%~nxm
pushd "!pth!"
For /r . %%f in (!name!) do (
set pth=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf
set "name=!name!_!date:~6,4!!date:~3,2!!date:~0,2!!ending!
echo renaming "!datsave!" to "!name!"
rem ren "!datsave!" "!name!"
popd
)
)
paths.txt
仅包含一行C:\full\path\to\test\*.txt
test
目录包含2个文本文件和1个其他文件输出:
renaming "bar.txt" to "bar_20160812.txt"
renaming "foo.txt" to "foo_20160812.txt"
(只需取消注释
ren
行即可完成工作)关于batch-file - 使用通配符路径重命名文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38911430/