使用 bat 脚本读取不同文件夹中存在的相应文本文件后重命名多个 pdf 文件

Posted

技术标签:

【中文标题】使用 bat 脚本读取不同文件夹中存在的相应文本文件后重命名多个 pdf 文件【英文标题】:Rename multiple pdf files after reading corresponding text files present in different folder using bat script 【发布时间】:2019-03-18 18:59:24 【问题描述】:

问题

我正在编写一个 bat 脚本,它应该能够从 Z:/Demo/Text 等位置读取 1000 个文本文件,并且在读取存储的值后,该脚本能够重命名 Z 处存在的相应 pdf 文件:/演示/PDF。文本文件按以下方式命名和读取:SomeDate_Part1.txt、SomeDate_Part2.txt....

PDF文件具有相同的属性,只是文件扩展名不同。

重命名逻辑:

如果 SomeDate_Part1.txt 文件中存储的值为 AAA,则对应的 PDF 文件 SomeDate_Part1.pdf 应重命名为 CGI1_filename.pdf,如果存储的值为 BBB,则应重命名为 CGI2_filename.pdf。

我写了几行,就可以成功地从文件夹中读取所有文本文件。我写的代码是:

@echo off
for %%x in (\Demo\Text\*.txt) do (
    for /f "usebackq delims=" %%a in ("%%~fx") do (
        if "%%a"=="AAA" echo %%a
        if "%%a"=="BBB" echo %%a
    )
)
pause

我该如何解决剩下的问题?

【问题讨论】:

我不明白你的“重命名逻辑”。如果存储在 .txt 文件中的 line 是 ZZZ,则相应的 .pdf 文件应该重命名为 CGI26.pdf?这个“逻辑”只给出了 26 个不同的名称,因此您可以使用它来重命名 1000 个文件... 那么是什么阻止您将 echo %%a 更改为您要使用的重命名命令? @Aacini 只有两个可能的存储值 AAA 或 BBB,它不遵循字母顺序。 Squashman- 由于我不熟悉批处理文件,我无法写下程序将转到 PDF 文件夹并遍历每个文件并重命名的代码 生成的文件名应该是CGI1_SomeDate_Part1.pdf 还是CGI2_SomeDate_Part1.pdf 【参考方案1】:

如果您愿意继续使用 PowerShell,此代码可能会满足您的需求。我还没有测试过。如果您确信文件将被正确重命名,请从 Rename-Item cmdlet 中删除 -WhatIf

将此脚本另存为Rename-PdfFiles.ps1

Get-ChildItem -File -Path '\Demo\Text' -Filter '*.txt' |
    ForEach-Object 
        $fn = $_.BaseName
        $pdfname = "\Demo\Text\$($fn).pdf"

        if (Test-Path -Path $pdfname) 
            $mark = Get-Content -Path $_
            if ($mark -eq 'AAA')  $prefix = 'CGI1'  else  $prefix = 'CGI2' 
            Rename-Item -Path $pdfname -NewName "$($prefix)_$(fn).pdf" -WhatIf
        
    

使用以下命令从 cmd shell 运行它:

powershell -NoProfile -File .\Rename-PdfFiles.ps1

如果您无法通过制作 .bat 文件,这可能会起作用。我也没有测试过这个。如果它输出正确的RENAME 命令,则删除行首的echo

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%x IN ('\Demo\Text\*.txt') DO (
    SET "FN=%%~nx"
    SET "PDFNAME=\Demo\Text\!FN!.pdf"

    IF EXIST "!PDFNAME! (
        SET /P "MARK=" <"%%~x"
        IF "!MARK!" == "AAA" ( SET "PREFIX=CGI1" ) else ( SET "PREFIX=CGI2" )
        echo RENAME "!PDFNAME!" "!PREFIX!_!FN!.pdf"
    )

【讨论】:

【参考方案2】:
@echo off
setlocal EnableDelayedExpansion

set "AAA=1"
set "BBB=2"

for %%x in (\Demo\Text\*.txt) do (
    for /f "usebackq delims=" %%a in ("%%~Fx") do (
        ren "\Demo\PDF\%%~Nx.pdf" "CGI!%%a!_%%~Nx.pdf"
    )
)
pause

此代码实际上是原始代码的副本,只有两个不同点:

AAABBB 的值分别设置为12。这些值在问题说明中说明。 仅显示文本文件中的值的两个if 命令由所需的ren 命令更改,如问题描述中所要求的。在ren 命令中,.pdf 文件的位置设置为\Demo\PDF,如问题所述。名称的新部分由CGI!%%a!_ 组成。 %%a 包含存储在文本文件中的值,即 AAABBB 根据描述。这样!%%a!部分变为!AAA!!BBB!,通过延迟扩展替换为AAABBB的值,所以新的文件名为CGI1_SomeDate_Part1.pdfCGI2_SomeDate_Part2.pdf。在问题中。

【讨论】:

以上是关于使用 bat 脚本读取不同文件夹中存在的相应文本文件后重命名多个 pdf 文件的主要内容,如果未能解决你的问题,请参考以下文章

windows下配置启动脚本并设置开机自启及相应关闭脚本

自己创建了一个bat,很简单的那种ping一个IP的,需要怎么写才能让他一直循环,且自动保存在一个文本文档里

bat批处理命令大全

[PYTHON][BAT][SHELL] 常见易忘 pythonbatshell 脚本操作汇总(持续更新)

如何编写bat文件

bat脚本启动Burp