gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:00:18 28 4
gpt4 key购买 nike

最近我开始工作,我的第一个任务是编写一个批处理文件,该文件自动将文件名更改为带有原始文件结尾的 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 中。
随着 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

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

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

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

最佳答案

好的,我发现了 2 个问题,现在它可以工作了
set name=%%~nxm评估通配符。即使名称是 *.txt它将返回 bar.txt .
我用基名计算代替了它:set name=!name:*\=!完成了足够多的时间(不是很微妙,但是批处理文件迫使我们做这样的事情)保留了通配符

另一个问题是 for /R loop : 之后 pushd , 参数必须是 .否则不会被扫描。

最后一个:使用 rename而不是 copydelete .它保留文件时间并且非常快。复制然后删除大文件可能需要很长时间。

@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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com