使用 bat 脚本读取不同文件夹中存在的相应文本文件后重命名多个 pdf 文件
Rename multiple pdf files after reading corresponding text files present in different folder using bat script
问题
我正在开发一个 bat 脚本,它应该能够从 Z:/Demo/Text 位置读取 1000 个文本文件,并且在读取存储的值后,该脚本能够重命名存在的相应 pdf 文件在说 Z:/Demo/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
如何解决剩下的问题?
@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
此代码实际上是原始代码的副本,只有两处不同:
AAA
和BBB
的值分别设置为1
和2
。这些值在问题描述中说明。
- 仅显示文本文件中的值的两个
if
命令被所需的 ren
命令更改,如问题描述中所要求的那样。在 ren
命令中,.pdf 文件的位置设置为 \Demo\PDF
如问题中所述。名称的新部分由 CGI!%%a!_
组成。 %%a
包含存储在文本文件中的值,根据描述为 AAA
或 BBB
。这样,!%%a!
部分变成了!AAA!
或!BBB!
,被AAA
或BBB
的值通过延迟扩展替换,所以新文件名是问题中要求的CGI1_SomeDate_Part1.pdf
或CGI2_SomeDate_Part2.pdf
。
如果您愿意继续使用 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"
)
问题
我正在开发一个 bat 脚本,它应该能够从 Z:/Demo/Text 位置读取 1000 个文本文件,并且在读取存储的值后,该脚本能够重命名存在的相应 pdf 文件在说 Z:/Demo/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
如何解决剩下的问题?
@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
此代码实际上是原始代码的副本,只有两处不同:
AAA
和BBB
的值分别设置为1
和2
。这些值在问题描述中说明。- 仅显示文本文件中的值的两个
if
命令被所需的ren
命令更改,如问题描述中所要求的那样。在ren
命令中,.pdf 文件的位置设置为\Demo\PDF
如问题中所述。名称的新部分由CGI!%%a!_
组成。%%a
包含存储在文本文件中的值,根据描述为AAA
或BBB
。这样,!%%a!
部分变成了!AAA!
或!BBB!
,被AAA
或BBB
的值通过延迟扩展替换,所以新文件名是问题中要求的CGI1_SomeDate_Part1.pdf
或CGI2_SomeDate_Part2.pdf
。
如果您愿意继续使用 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"
)