Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Bat - добавить дату к имени (http://forum.oszone.net/showthread.php?t=348440)

samr 02-04-2021 23:03 2954644

Bat - добавить дату к имени
 
Здравствуйте.

Есть папка, в которую падают .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 2954647

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 2954648

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

Второе: из представленных файлов и Вашего описания можно сделать вывод, что Ваше описание страдает неточностью, поскольку у файла:
Цитата:

Цитата samr
_02-04-21 invst02.txt »

нет даты в начале имени (а есть символ «_»). Поясните.

megaloman 03-04-2021 09:10 2954661

Как заказано. Считаю, что "_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

Однако я солидарен с 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 "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 2954764

Цитата:

Цитата megaloman
для каждого месяца отдельную папку»

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

samr 05-04-2021 13:05 2954860

Цитата:

Цитата Iska
samr, первое — дату лучше представлять не в виде ДД-ММ-ГГ, а в виде ГГГГ-ММ-ДД. Вы не возражаете? »

не возражаю.

Цитата:

Цитата Iska
нет даты в начале имени (а есть символ «_»). Поясните. »

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


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

megaloman 05-04-2021 13:56 2954866

samr,
Цитата:

Цитата Iska
дату лучше представлять ... в виде ГГГГ-ММ-ДД. Вы не возражаете? »

Цитата:

Цитата samr
не возражаю. »

Цитата:

Цитата samr
да, такой знак присутствует «_» »

То есть, не обрабатывать файлы вида:
"ГГГГ-ММ-ДД *.*" и "_ГГГГ-ММ-ДД *.*"
Для этого надо изменить рег. выражение в findstr под For:
Код:

findstr.exe /R /V /C:"^_*20[2-3][0-9]-[0-1][0-9]-[0-3][0-9] .*"
Примечание: файлы вида "______ГГГГ-ММ-ДД *.*" (количество "_" произвольно) тоже обрабатываться не будут.


Время: 19:31.

Время: 19:31.
© OSzone.net 2001-