如何每天重命名多个文件

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(注意SeaSea 之间的双空格)。对于我认为您打算使用的名称,您应该将重命名命令更改为 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,因为该文件已经存在。

【讨论】:

以上是关于如何每天重命名多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中批量移动复制追加和重命名文件

如何使用终端一次重命名多个文件?

如何使用 mv 命令重命名 unix 中的多个文件?

从命令行重命名多个文件[重复]

关于C#实现文件重命名

如何循环多个子文件夹并根据特定的 XML 标签重命名文件?