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

问题描述 投票:4回答:2

最近我开始工作,我的第一个任务是编写一个批处理文件,自动将文件名更改为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
)

)

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

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

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

因为name设置为第一个FOR-Loop开头的Path。但是,如果我不使用通配符,这似乎有效。

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

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

batch-file batch-processing batch-rename
2个回答
4
投票

好的,我发现了2个问题,现在它有效

set name=%%~nxm评估通配符。即使名称是*.txt它将返回bar.txt。我用basename计算代替了它: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线即可完成工作)


1
投票

Weeeeell首先再次感谢@ Jean-FrançoisFabre和@aschipfl对我的耐心:)在第二批文件的提示后,我不得不测试一些事情,因为并非一切都运行良好,但现在一切都很好!

主文件代码:

@echo off
setlocal EnableDelayedExpansion
cd %~dp0
set DEPTH=20

For /F %%m in (paths.txt) do (
pause
set pth=%%~dpm

  REM pushd !pth!
  REM set origpth=!cd!
  REM popd

set z=%%m
set name=!z!

For /L %%i in (1,1,%DEPTH%) do set 
name=!name:*\=!
set chkname=!name:*\=!
if not !chkname!==!name! ( echo depth to small
pause
exit /B)

rem set name=%%~nxm
pushd "!pth!"

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

pushd %~dp0
call renamefiles.bat %%f REM "!origpth!"
popd
)

)

和子文件的代码:

@echo off   

  REM set pth=%~dp1
  REM set origpth=%2
  REM set origpth=%origpath:"=%\

  REM If !pth!==%origpth% (

set path=%~dp1
set name=%~n1
set ending=%~x1
set datsave=%~nx1

pushd !path!

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

pause

echo renaming "!datsave!" to "!name!"
rem "!datsave!" "!name!"

cls
popd

  REM )

编辑:经过我的测试后,我认为,子文件夹也包括在内!我将额外的代码添加到标有REM的代码和两个额外的空格。取出那些REM,重命名时程序将不再包含子文件夹:)

© www.soinside.com 2019 - 2024. All rights reserved.