如何每天重命名多个文件
Posted
技术标签:
【中文标题】如何每天重命名多个文件【英文标题】:How to rename multiple files every day 【发布时间】:2021-02-03 05:42:50 【问题描述】:我正在尝试使用 bat 文件重命名多个文件。
我使用下面的代码并且工作正常。
for %%a in (*.csv) do ren "%%~a" "%%~na Sea %%~xa"
虽然问题是脚本每天都会运行,并且会逐渐添加多次“海”字
I.E First Day File name = "ho.csv" Script runs the first day and the output is : "ho Sea .csv" Second day File name "ho Sea .csv", "Go.csv" Script runs the second day and the output is : "ho Sea Sea .csv", "Go Sea .csv"
我不是很有经验,但最有可能的解决方案很简单,比如检查现有名称的 if...
您对此有什么解决方案吗?
还有什么方法可以让脚本每天在特定的时间运行?
提前谢谢你!!!
【问题讨论】:
请edit您的问题并提供您自己的编码尝试minimal reproducible example!根据您的示例,新文件名不会是ho Sea.csv
,而是ho Sea .csv
,所以请澄清!要定期运行脚本,请使用 Windows 任务计划程序...
您好@aschipfl 感谢您的友好输入。确实,您是对的,我在帖子中对其进行了编辑。我尝试使用 windows 任务计划程序,但 cmd 窗口打开,没有任何反应。
您发布的示例代码不会像ho Sea.csv
这样在第一天生成/重命名文件,而是像ho Sea .csv
这样生成它们,我强烈建议您不要这样做。第二天,该文件将变为ho Sea Sea .csv
,而不是您的示例中的ho Sea Sea .csv
,(注意Sea
和Sea
之间的双空格)。对于我认为您打算使用的名称,您应该将重命名命令更改为 ren "%%~a" "%%~na Sea%%~xa"
。
【参考方案1】:
尝试将您当前的命令替换为:
for /f "delims=" %%a in ('dir /b ^| findstr /V ".*Sea\.csv"') do ren "%%~a" "%%~na Sea %%~xa"
【讨论】:
确实有问题。编辑答案。 好多了。使用dir /b *.csv
使其更安全(避免重命名.csv
以外的其他文件)
…甚至dir /B /A:-D-H-S *.csv
过滤掉目录、隐藏和系统文件…【参考方案2】:
针对您的具体问题的解决方案是将已经以字符串 Sea
结尾的文件基名排除在传递给您的for-loop 的Do
部分。为此,最简单的方法是通过findstr.exe
传递命令。
@For /F Delims^= %%G In ('Dir /B /A:-D *.csv ^| %__AppDir__%findstr.exe /EILV " Sea.csv"') Do @Ren "%%G" "%%~nG Sea%%~xG"
但是,使用 Dir
可能会出现问题,因为 8.3 文件名“默认开启”。这意味着 glob *.csv
将匹配以不区分大小写字符串 .csv
开头的文件扩展名,而不是与不区分大小写字符串完全匹配的文件扩展名。虽然您可能不太可能拥有以.csv
开头的其他扩展名,但我以前见过.csvt
文件。因此,为了安全起见,您应该先将 Dir
结果通过另一个 findstr
过滤以仅过滤到 .csv
:
@For /F Delims^= %%G In ('"Dir /B /A:-D *.csv | %__AppDir__%findstr.exe /EIL ".csv" | %__AppDir__%findstr.exe /EILV " Sea.csv""') Do @Ren "%%G" "%%~nG Sea%%~xG"
要忽略 8.3 命名,您可以改用 where
命令,(windows-vista 和更新版本)。但是,where.exe
有一个额外的潜在问题,因为它还将匹配.csv.ext
,其中.ext
将是当前环境的%PATHEXT%
变量值中列出的每一个。为了防止您需要为该特定环境清空 %PATHEXT%
变量:
@For /F Delims^= %%G In ('"(Set PATHEXT=) & %__AppDir__%where.exe .:*.csv 2> NUL | %__AppDir__%findstr.exe /EILV " Sea.csv""') Do @Ren "%%G" "%%~nG Sea%%~xG"
因此,我会敦促您使用两个较低示例中的任何一个,而不是此答案顶部的版本。
【讨论】:
【参考方案3】:最简单的方法是使用 PowerShell。如果您使用的是受支持的 Windows 系统。 PowerShell 将可用。当您确信文件将被正确重命名时,请从 Rename-Item 命令中删除 -WhatIf
。
Get-ChildItem -File -Path 'C:\src\t' |
Where-Object $_.Name -notmatch ' Sea\.' |
ForEach-Object
Rename-Item -Path $_.FullName -NewName $($_.BaseName + ' Sea' + $_.Extension) -WhatIf
如果存在名称冲突,此代码不会执行任何操作。例如,在第 1 天,t.txt
文件被重命名为 t Sea.txt
。如果在第 2 天将另一个 t.txt
文件放入目录中,则无法将其重命名为 t Sea.txt
,因为该文件已经存在。
【讨论】:
以上是关于如何每天重命名多个文件的主要内容,如果未能解决你的问题,请参考以下文章