批处理文件,为基于月份字符串的文件名添加数字前缀



银行通常会提供基于日历月份(一月、二月等(的pdf对账单,这些对账单最终会在您的文件夹中按"字母"顺序排列!

我每年都会将这些文件保存到一个文件夹中(因此每个文件夹中有12个文件(,但希望使用简单的批处理文件为每个文件名添加一个数字前缀(01代表1月,02代表2月,等等(,这样Windows资源管理器就会以"正确"的顺序显示它们。

我正在运行Win 10,需要一个简单的文件,因为我的编程技能非常有限。有人能帮忙吗?

基本上,我只想要一个简单的批处理文件,我可以把它放在一个文件夹中,当它运行时,会改变文件夹中的文件名如下:-

2017_April_Statement.pdf  
2017_August_Statement.pdf  
2017_December_Statement.pdf  
2017_February_Statement.pdf  
2017_January_Statement.pdf  
2017_July_Statement.pdf  
2017_June_Statement.pdf  
2017_March_Statement.pdf  
2017_May_Statement.pdf  
2017_November_Statement.pdf  
2017_October_Statement.pdf  
2017_September_Statement.pdf  

到此:-

01 2017_January_Statement.pdf  
02 2017_February_Statement.pdf  
03 2017_March_Statement.pdf  
04 2017_April_Statement.pdf  
05 2017_May_Statement.pdf  
06 2017_June_Statement.pdf  
07 2017_July_Statement.pdf  
08 2017_August_Statement.pdf  
09 2017_September_Statement.pdf  
10 2017_October_Statement.pdf  
11 2017_November_Statement.pdf  
12 2017_December_Statement.pdf

我希望这是明确的,并将感谢任何提供的建议。

[我之前的研究:我自己无法编写代码,这远远超出了我的能力水平,所以到目前为止,我所做的只是尝试(在谷歌上搜索(已经在网上编写的代码片段,但我得到的所有结果似乎都是根据时间戳而不是文件名中的月份名称字符串来重新排序文件。]

经过思考:
我想脚本会这样操作:-

For n=1 to 12  
Read each filename in turn  
Do  
If filename contains $="jan" then add prefix "01" to filename  
If filename contains $="feb" then add prefix "02" to filename  
... and so on, until ...  
If filename contains $="dec" then add prefix "12" to filename  
next n  
End 

理想情况下,自变量(jan、feb等(将而不是区分大小写。

非常感谢两位贡献者
我将重点学习有关PowerShell脚本使用的更多信息(现在我已经看到了它们的用处,并查看了MS为它们提供的ISE,我还将尝试弄清楚非常优雅的批处理脚本中的命令是如何准确工作的,这样我就可以自己使用其中的技术了!
我从这项练习中学到了很多东西;感谢大家的帮助。

也非常感谢另外三位贡献者,他们为这个问题提供了解决方案;你们花时间解决这个问题真是太好了。然而,提供的第一个(批次(解决方案正是我所需要的,所以我将从现在开始使用它

我想这个线程现在可以被认为是"关闭的"(但我不知道如何做到这一点,甚至不知道我是否可以做到这一步;也许它应该被传递给一个"mod"来关闭?(

再次感谢所有。:(

下面的批处理脚本也会执行此操作。它比powershell脚本长。

@ECHO OFF
SETLOCAL
REM Call renameFile on each file in the current folder
FOR /F "delims=*" %%F IN ('DIR /B') DO (
CALL :renameFile "%%~F"
)
(ENDLOCAL
EXIT /B 0)

:: ========================================================================
:renameFile
SETLOCAL EnableDelayedExpansion
SET "FNAME=%~1"
SET "index=-1"
REM Check to see if the filename contains this value, done by using logic
REM that changes the FCOPY variable to replace jan, feb, mar with nothing
REM and then compare against the original
FOR %%M IN (jan feb mar apr may jun jul aug sep oct nov dec) DO (
CALL :getIndex index "%FNAME%" "%%~M"
IF !index! NEQ -1    GOTO :renameFile_IndexDone
)
:renameFile_IndexDone
REM index is either -1 (not found) or a value to change, if not found then
REM don't rename the file
IF %index% EQU -1    EXIT /B 0
REM now look to see if the file already has the index - don't want to add it
REM multiple times
IF "%FNAME:~0,2%" EQU "%index%"    EXIT /B 0
REM We have an index and the file hasn't been renamed yet, so rename it
move /y "%FNAME%" "%index% %FNAME%"
(ENDLOCAL
EXIT /B 0)


:: ========================================================================
:getIndex
SETLOCAL EnableDelayedExpansion
SET "OUTVAR=%~1"
SET "FNAME=%~2"
SET "month=%~3"
SET "retVal=-1"
REM Setup replacement variables. Can use full names or just the first three
REM characters. Currently three characters so it works for full names and
REM common abbreviation.
SET "jan=01"
SET "feb=02"
SET "mar=03"
SET "apr=04"
SET "may=05"
SET "jun=06"
SET "jul=07"
SET "aug=08"
SET "sep=09"
SET "oct=10"
SET "nov=11"
SET "dec=12"
SET "FCHECK=!FNAME:%month%=!"
IF "%FCHECK%" NEQ "%FNAME%" (
CALL SET "retVal=%%%month%%%"
)
(ENDLOCAL
SET "%OUTVAR%=%retVal%"
EXIT /B 0)

您可以创建一个*.ps1文件(powershell(并将此代码写入该文件:

Get-ChildItem "C:Banking2017" -Filter '*.pdf' | 
Foreach-Object {
$name = ''
if($_.BaseName -like '*january*') {$name = '01 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*february*') {$name = '02 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*march*') {$name = '03 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*april*') {$name = '04 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*may*') {$name = '05 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*june*') {$name = '06 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*july*') {$name = '07 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*august*') {$name = '08 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*september*') {$name = '09 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*october*') {$name = '10 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*november*') {$name = '11 ' + $_.BaseName + ".pdf"}
if($_.BaseName -like '*december*') {$name = '12 ' + $_.BaseName + ".pdf"}
Rename-Item $_.FullName -NewName $name
}

这个powershell脚本将为这个示例路径完成您的工作:C:Banking2017,要执行这个脚本,只需右键单击并选择:Run with powershell

享受吧!

这个批处理脚本也可以做到这一点:

@echo off
Title Add a numerical prefix to filenames that are based on month strings
SetLocal EnableDelayedExpansion
for %%a in (January February March April May June July August September October November December) do (
set /A i+=1
set month[!i!]=%%a
)
@for /L %%j in (1,1,%i%) do (
@for /f "delims=" %%b in ('Dir /B *.pdf ^|find /I "!month[%%j]!"') do (
Set "FileName=%%~b"
Call :Trim !FileName! FileName
If /I [!month[%%j]!] EQU [January] Set "Num_Month=01"
If /I [!month[%%j]!] EQU [February] Set "Num_Month=02"
If /I [!month[%%j]!] EQU [March]    Set "Num_Month=03"
If /I [!month[%%j]!] EQU [April]    Set "Num_Month=04"
If /I [!month[%%j]!] EQU [May]      Set "Num_Month=05"
If /I [!month[%%j]!] EQU [June]     Set "Num_Month=06"
If /I [!month[%%j]!] EQU [July]     Set "Num_Month=07"
If /I [!month[%%j]!] EQU [August]   Set "Num_Month=08"
If /I [!month[%%j]!] EQU [September] Set "Num_Month=09"
If /I [!month[%%j]!] EQU [October]   Set "Num_Month=10"
If /I [!month[%%j]!] EQU [November] Set "Num_Month=11"
If /I [!month[%%j]!] EQU [December] Set "Num_Month=12"
echo renaming file "!FileName!" To "!Num_Month! !FileName!"
Ren "!FileName!" "!Num_Month! !FileName!"
)
)
EndLocal
pause & exit
::*************************************************************************
:Trim <String> <Var to Set>
(echo Wscript.echo Trim("%~1"^))>"%tmp%%~n0.vbs"
for /f "delims=" %%a in ('Cscript /nologo "%tmp%%~n0.vbs"') do set "%2=%%a"
exit /b
::**************************************************************************

在PowerShell中执行此操作的另一种方法。当您确信文件将被正确重命名时,请从Rename-Item命令中删除-WhatIf

$baseDir = 'C:/src/t/premonth'
$monthHash = @{
'january' = '01'; 'february' = '02'; 'march' = '03'; 'april' = '04'
'may' = '05'; 'june' = '06'; 'july' = '07'; 'august' = '08'
'september' = '09'; 'october' = '10'; 'november' = '11'; 'december' = '12'
}
Get-ChildItem -File -Path $baseDir -Filter '*.pdf' |
ForEach-Object {
if ($_.Name -match '^d{4}_(.*)_Statement.pdf') {
Rename-Item -Path $_.FullName -NewName $($monthHash[$Matches[1]] + ' ' + $_.Name) -WhatIf
}
}

您是否要求一个简单批处理文件?

@echo off
setlocal EnableDelayedExpansion
rem Create a two-digits NumberOfMonth array
set "i=100"
for %%a in (January February March April May June
July August September October November December) do (
set /A i+=1
set "NOM[%%a]=!i:~1!"
)
rem Rename the files
for /F "tokens=1-3 delims=_" %%a in ('dir /B *.pdf') do (
ren "%%a_%%b_%%c" "!NOM[%%b]! %%a_%%b_%%c"
)

此批处理文件执行您的请求。当然,可以添加更多的功能。例如:

@echo off
setlocal EnableDelayedExpansion
rem Create a two-digits NumberOfMonth array
set "i=100"
for %%a in (January February March April May June
July August September October November December) do (
set /A i+=1
set "NOM[%%a]=!i:~1!"
)
rem Rename the files, but only properly formed file names
for /F "tokens=1-3 delims=_ " %%a in ('dir /B *.pdf') do (
if defined NOM[%%b] ren "%%a_%%b_%%c" "!NOM[%%b]! %%a_%%b_%%c"
)

在第二段代码中,添加if以检查文件名是否具有正确的格式,月份名称在second元素中。在delims=FOR子句中还添加了一个空格,以便检测已重命名的文件。

最新更新