Пакетный файл для добавления числового префикса к именам файлов, которые основаны на строках месяца - PullRequest
1 голос
/ 23 октября 2019

Банки, между прочим, часто предоставляют выписки в формате pdf с именами, основанными на календарных месяцах (январь, февраль и т. Д.), И они, в конечном итоге, располагаются в «алфавитном» порядке внутри ваших папок!

Я сохраняюфайлы в папке для каждого года (по 12 файлов в каждом), но хотелось бы, чтобы простой пакетный файл добавлял числовой префикс к каждому имени файла (01 для января, 02 для февраляи т. д.), чтобы проводник 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

Надеюсь, это понятно и буду благодарен за любые предложения.

[Мои предыдущие исследования: я не могу написать код самэто намного выше моего уровня компетенции, поэтому все, что я до сих пор делал, это пытался найти (поискать в Google) фрагменты кода, уже написанного в сети, но все результаты, которые я получаю, похоже, предназначены для переупорядочения файлов на основевременные метки, а не строки с названиями месяцев внутри имен файлов.]

Запоздалая мысль:
Я бы предположил, что скрипт будет работать примерно так: -

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 (теперь я увидел, насколько они могут быть полезными, и посмотрел на ISE, который MS предоставил для них, и я также попытаюсь выяснить, как именно работают команды в очень элегантном пакетном сценарии, поэтому яможет быть, я сам использую эти приемы!
Я многому научился из этого упражнения;спасибо всем однажды aagin.

Большое спасибо также еще трем участникам, которые добавили свои решения проблемы;Хорошо, что вы нашли время для решения этой проблемы. Тем не менее, первое (пакетное) решение предлагает именно то, что мне нужно, поэтому я буду использовать его с этого момента.

Полагаю, этот поток можно считать закрытым (но я не знаю, как это сделать). сделать это или даже если я МОГУ это сделать, возможно, его следует передать в «мод» для закрытия?)

Еще раз спасибо all . :))

Ответы [ 5 ]

0 голосов
/ 23 октября 2019

Вы запрашивали простой Пакетный файл?

@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"
)

В этом втором коде добавляется , если , чтобы проверить, имеет ли имя файла правильный формат, с названием месяца в элементе second ,Также добавляется пробел в предложении delims = FOR для обнаружения уже переименованных файлов.

0 голосов
/ 23 октября 2019

Еще один способ сделать это в PowerShell. Если вы уверены, что файлы будут переименованы правильно, удалите -WhatIf из команды Rename-Item.

$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
        }
    }
0 голосов
/ 23 октября 2019

Следующий пакетный скрипт тоже сделает это. Это длиннее, чем скрипт 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)
0 голосов
/ 23 октября 2019

Этот пакетный скрипт тоже справился с задачей:

@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
::**************************************************************************
0 голосов
/ 23 октября 2019

Вы можете создать файл *.ps1 (powershell) и записать этот код в этот файл:

Get-ChildItem "C:\Banking\2017\" -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:\Banking\2017\, чтобы выполнить этоСценарий просто щелкните правой кнопкой мыши и выберите: Run with powershell

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...