【问题标题】:Bulk rename files using part of existing filename使用现有文件名的一部分批量重命名文件
【发布时间】:2018-07-23 15:52:50
【问题描述】:

StackOverflow 的新手(发帖),不是新手,它在无数场合拯救了我。不幸的是,这次我找不到可以为我指明正确方向的信息。

每天,我都会收到一个包含多个文件名的 zip 文件。我需要一种方法,每天使用现有文件名的一部分和当前日期重命名每个文件。所以文件将来自:

示例 -

thisisjust_atest.pdf
another_test.pdf
just_anothertest.pdf
yayone_moretest.pdf

atest - 2018-02-13.pdf
test - 2018-02-13.pdf
anothertest - 2018-02-13.pdf
moretest - 2018-02-13.pdf

我打算通过 VB 脚本以某种方式执行此操作,以便在整理文件后通过电子邮件发送文件,但这只是因为我在其他方面没有太多经验。很高兴被指出正确的方向。

任何帮助将不胜感激,在此先感谢。

【问题讨论】:

  • 您运行的是哪个操作系统?就您所说的 VB 脚本而言,我猜是 windows
  • 嗨,正在运行 Windows。

标签: windows file cmd zip rename


【解决方案1】:
@echo off
setlocal enabledelayedexpansion
REM get date in desired format:
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set "today=%%I"
set "today=%today:~0,4%-%today:~4,2%-%today:~6,2%"

REM for every matching file...
for %%A in (*_*.pdf) do (
  REM ...get desired part...
  for /f "tokens=2 delims=_" %%B in ("%%~nA") do (
    REM ... and add datestring:
    ECHO ren "%%A" "%%B - %today%%%~xA"
  )
)

注意:删除ECHO,如果输出正是你想要的。

【讨论】:

  • 谢谢,我们设法调整代码来满足我们的需要。再次感谢,非常有帮助!
【解决方案2】:

这在 PowerShell 中非常简单。使用正则表达式获取现有名称的所需部分。然后,连接当前日期以获得新的文件名。

如果您确信重命名操作正确,请从 Rename-Item cmdlet 中删除 -WhatIf

Get-ChildItem -Filter *.pdf -File |
    ForEach-Object {
        $newbase = $_.Name -replace '.*_([^_]*)\.pdf','$1'
        $newname = "$newbase - $(Get-Date -UFormat %Y-%m-%d).pdf"
        Rename-Item -Path $_.FullName -NewName $newname -WhatIf
    }

请注意,如果通过删除名称的第一部分来创建重复名称,这并不能解决问题。

请注意,即使原始文件名包含多个下划线字符,这也会起作用。

如果您必须从 cmd.exe shell(.bat 文件)运行它,则将 PowerShell 代码放入文件,例如 renamenews.ps1。然后调用它:

powershell -NoLogo -NoProfile -File renamenews.ps1

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2020-01-29
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多