Войти

Показать полную графическую версию : Bat - добавить дату к имени


samr
02-04-2021, 23:03
Здравствуйте.

Есть папка, в которую падают .txt файлы в течении дня.
В этой папке лежат файлы с разными именами, пример:
12345.txt
inv01.txt
prihod.txt
02-04-21 prihod 01.txt
02-04-21 invst.txt
_02-04-21 invst02.txt

Нужно сделать так, что бы bat-ник при запуске, добавлял ко всем файлам в начале текущую дату в формате ДД-ММ-ГГ и не трогал файлы у которых уже есть дата.
т.е. добавить даты только к этим файлам:
12345.txt
inv01.txt
prihod.txt

DJ Mogarych
02-04-2021, 23:28
Powershell

$t = get-date -Format dd-MM-yy
dir "C:\temp\test\*.txt" |? name -notmatch "\d{2}-\d{2}-\d{2}" |% {Rename-Item "$($_.FullName)" -NewName "$t $_"}

Iska
02-04-2021, 23:29
samr, первое — дату лучше представлять не в виде ДД-ММ-ГГ, а в виде ГГГГ-ММ-ДД. Вы не возражаете?

Второе: из представленных файлов и Вашего описания можно сделать вывод, что Ваше описание страдает неточностью, поскольку у файла:
_02-04-21 invst02.txt »
нет даты в начале имени (а есть символ «_»). Поясните.

megaloman
03-04-2021, 09:10
Как заказано. Считаю, что "_02-04-21 invst02.txt" - это неточность постановки, не переименовываю файлы "дд-мм-гг *.*"
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Set "Now=%%d"
Set "Now=%Now:~6,2%-%Now:~4,2%-%Now:~2,2%"

Pushd "%BoxIn%" && (
For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D ^| findstr.exe /R /V /C:"^[0-3][0-9]-[0-1][0-9]-[2-3][0-9] .*"`) Do (
Ren "%%f" "%Now% %%f"
)
Popd
)
pause
Exit /B
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Set "Now=%%d"
Set "Now=%Now:~0,4%-%Now:~4,2%-%Now:~6,2%"

Pushd "%BoxIn%" && (
For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D ^| findstr.exe /R /V /C:"^20[2-3][0-9]-[0-1][0-9]-[0-3][0-9] .*"`) Do (
Ren "%%f" "%Now% %%f"
)
Popd
)
pause
Exit /B
Но, даже если согласиться с Iska, постановка задачи далеко не идеальна, результат такой работы - громадное количество файлов в одной папке. @Echo Off
cls
Set "BoxIn=Z:\Box_In"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO Set "Now=%%d"
Set "NowM=%Now:~0,4%-%Now:~4,2%"
Set "Now=%Now:~0,4%-%Now:~4,2%-%Now:~6,2%"

Pushd "%BoxIn%" && (
If Not Exist "%NowM%\" Md "%NowM%"
For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D ^| findstr.exe /R /V /C:"^20[2-3][0-9]-[0-1][0-9]-[0-3][0-9] .*"`) Do (
Ren "%%f" "%Now% %%f"
)
>nul 2>nul Move /Y "%Now% *.*" "%NowM%\"
Popd
)
pause
Exit /B

alpap
04-04-2021, 15:21
для каждого месяца отдельную папку»
а я не раз это тоже говорил что от организации своей работы будет зависеть сложность подобных кодов и свободное время
в данном случае вообще должны быть отдельные директории: "Prixod", "investic", ... внутри папки с месяцами, а файлы должны приходить с четкими именами под эти папки и месяцем и укладываться по назначению и добиться этого надо начиная с себя и выше или ниже по цепочке.

samr
05-04-2021, 13:05
samr, первое — дату лучше представлять не в виде ДД-ММ-ГГ, а в виде ГГГГ-ММ-ДД. Вы не возражаете? »
не возражаю.

нет даты в начале имени (а есть символ «_»). Поясните. »
да, такой знак присутствует «_» - т.е. дату файлу присвоил, но потом пометил его, что к нему я еще вернусь (обработка данных внутри файла не закончена)


Все файлы в такой папке(сетевой) копятся, обрабатываются и хранятся максимум 2 дня. После раскидываются по разным папкам (это уже другая задача и она решена).

megaloman
05-04-2021, 13:56
samr, дату лучше представлять ... в виде ГГГГ-ММ-ДД. Вы не возражаете? »не возражаю. » да, такой знак присутствует «_» »То есть, не обрабатывать файлы вида:
"ГГГГ-ММ-ДД *.*" и "_ГГГГ-ММ-ДД *.*"
Для этого надо изменить рег. выражение в findstr под For:findstr.exe /R /V /C:"^_*20[2-3][0-9]-[0-1][0-9]-[0-3][0-9] .*"Примечание: файлы вида "______ГГГГ-ММ-ДД *.*" (количество "_" произвольно) тоже обрабатываться не будут.




© OSzone.net 2001-2012