Показать полную графическую версию : Пробел вместо нуля в разряде десятков часов
megaloman,
а как добавить дату-время к множеству файлов (например, *.iso)? Пробовал так:
@Echo Off
for %%i in (*.iso) do (
Call :WRen "%~dp0%%i"
GoTo :Eof
:WRen
SetLocal
If Not Exist %1 Exit /B 2
Set "Fin=%~1"
Set "Fin=%Fin:\=\\%"
For /f "tokens=1* delims=," %%a in ('wmic datafile where "name='%Fin%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" Set "Df=%%b"
)
Ren %1 "%~n1`%Df:~0,4%'%Df:~4,2%'%Df:~6,2%`%Df:~8,2%'%Df:~10,2%'%Df:~12,2%%~x1" ||Exit /B 1
EndLocal
)
Exit /B 0
, но таким способом обрабатывается только один iso-файл (первый по имени)...
DJ Mogarych
04-11-2022, 21:31
Powershell:
dir C:\temp\*.iso |Rename-Item -NewName {$_.BaseName + $_.CreationTime.ToString("yyyy-MM-dd_HH-mm-ss") + $_.extension} -WhatIf
Уберите -whatif, чтобы реально переименовывало. Формат даты подправьте, если надо.
megaloman
04-11-2022, 21:48
@Echo Off
Call :WRenMask "Z:\Основная папка\*.iso"
GoTo :Eof
:WRenMask
SetLocal
If Not Exist %1 Exit /B 2
For %%f In (%1) Do (
Set "Fin=%%~f"
Call Set "Fin=%%Fin:\=\\%%"
For /f "tokens=1* delims=," %%a in ('Call wmic datafile where "name='%%Fin%%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" (
Set "Df=%%b"
Call Ren "%%~f" "%%~nf`%%Df:~0,4%%'%%Df:~4,2%%'%%Df:~6,2%%`%%Df:~8,2%%'%%Df:~10,2%%'%%Df:~12,2%%%%~xf"
)
)
)
EndLocal
Exit /B
megaloman
04-11-2022, 22:11
Торможу, пока въехал в смысл кода, можно было процедуру и не менять@Echo Off
For %%f In ("Z:\Основная папка\*.iso") Do Call :WRen "%%~f"
GoTo :Eof
:WRen
SetLocal
If Not Exist %1 Exit /B 2
Set "Fin=%~1"
Set "Fin=%Fin:\=\\%"
For /f "tokens=1* delims=," %%a in ('wmic datafile where "name='%Fin%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" Set "Df=%%b"
)
Ren %1 "%~n1`%Df:~0,4%'%Df:~4,2%'%Df:~6,2%`%Df:~8,2%'%Df:~10,2%'%Df:~12,2%%~x1" ||Exit /B 1
EndLocal
Exit /B 0
megaloman, спасибо.
1. Код2 компактнее, но... Если использовать Код2 в составе другого батника (но не в его конце!), то последняя строка Exit /B 0, естественно, недопустима. А если ее нет (а далее идут другие строки!), то обрабатывается только один iso-файл (первый по имени). При тех же условиях: Код1 обрабатывает все файлы даже без своей последней строки Exit /B .
Для иллюстрации: запустите оба Кода в их теперешнем виде, заменив только их последние строки на, например, notepad или pause.
2. Апостроф (или английская одиночная кавычка) в имени файла недопустим (т.к. уже используется в Коде), поэтому обработка файлов по второму кругу заканчивается ошибками. Учту...
3. В составе большого батника уже успешно использую Код1 в таком несколько сокращенном виде:
if exist "*.iso" (
echo Старые *.iso : переименование и перемещение в ISO-OLD\ . . .
call :wrenmask "%~dp0*.iso"
:wrenmask
for %%f in (%1) do (
set "Fin=%%~f"
call set "Fin=%%Fin:\=\\%%"
for /f "tokens=1* delims=," %%a in ('call wmic datafile where "name='%%Fin%%'" get 'LastModified' /format:csv') do if /i "%%a"=="%ComputerName%" (
set "Df=%%b"
if not exist "ISO-OLD" md "ISO-OLD"
call move "%%~f" "ISO-OLD\%%~nf--%%Df:~2,6%%-%%Df:~8,4%%%%~xf"
)
)
if exist "*.iso" (echo. && echo Некоторые старые *.iso остались на прежнем месте - доступ?)! && echo. && pause && exit)
echo переименованы и перемещены
echo.
) Но ведь работает же! Критикуйте, если что...
4. На текущий момент главная задача Вашими усилиями уже решена, но все же:
вот бы так же применить Код2...
megaloman
05-11-2022, 20:11
dassen, Не сильно понял, что Вы хотите и чем Вас мой код не устроил, то ли с процедурой :WRenMask то ли :WRen
@Echo Off
Call :WRenMask "Z:\Основная папка\*.iso"
GoTo :Eof@Echo Off
For %%f In ("Z:\Основная папка\*.iso") Do Call :WRen "%%~f"
GoTo :Eof
GoTo :Eof можно заменить Exit /B, но это не играет никакой роли. Главное, есть блок кода (условно назовём главный), в котором вызывается процедура. В первом случае просто Call, во втором - Call в цикле. Не надо, как Вы в начале сделали, под тело цикла помещать процедуру. Рассматривайте процедуру как отдельную программную единицу.
Если хотите что-то делать после её отработки - продолжайте развивать главный код.@Echo Off
........Если что-то надо дописать в начале
........Если что-то надо дописать в начале
........Если что-то надо дописать в начале
Call :WRenMask "Z:\Основная папка\*.iso"
........Если что-то надо дописать после вызова процедуры
........Если что-то надо дописать после вызова процедуры
........Если что-то надо дописать после вызова процедуры
GoTo :Eof@Echo Off
........Если что-то надо дописать в начале
........Если что-то надо дописать в начале
........Если что-то надо дописать в начале
For %%f In ("Z:\Основная папка\*.iso") Do Call :WRen "%%~f"
........Если что-то надо дописать после вызова процедуры
........Если что-то надо дописать после вызова процедуры
........Если что-то надо дописать после вызова процедуры
GoTo :Eof
Убедитесь сами - поставьте перед GoTo :Eofнапример, notepad или pause. »
Если надо изваять еще процедуру(ы), то после или GoTo :Eof или Exit вставляете свой код Вашей процедуры (не внутри главной части, не внутри старой процедуры), например:
:NameMyProcedure
..... Ваше творчество
Exit /B
и вызывайте эту процедурищу колом в главной части.
Предыдущие процедуры, подправленные для Move@Echo Off
cls
Set "BoxOut=Z:\Основная папка\Moved and renamed"
If Not Exist "%BoxOut%\" Md "%BoxOut%"
Call :WMoveMask "Z:\Основная папка\*.iso"
Echo Ура!
Pause
Exit /B
:WMoveMask
SetLocal
If Not Exist %1 Exit /B 2
For %%f In (%1) Do (
Set "Fin=%%~f"
Call Set "Fin=%%Fin:\=\\%%"
For /f "tokens=1* delims=," %%a in ('Call wmic datafile where "name='%%Fin%%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" (
Set "Df=%%b"
>nul Call Move "%%~f" "%BoxOut%\%%~nf_%%Df:~0,4%%.%%Df:~4,2%%.%%Df:~6,2%%-%%Df:~8,2%%.%%Df:~10,2%%.%%Df:~12,2%%%%~xf"
)
)
)
EndLocal
Exit /B@Echo Off
cls
Set "BoxOut=Z:\Основная папка\Moved and renamed"
If Not Exist "%BoxOut%\" Md "%BoxOut%"
For %%f In ("Z:\Основная папка\*.iso") Do Call :WMove "%%~f"
Echo Ура!
Pause
GoTo :Eof
:WMove
SetLocal
If Not Exist %1 Exit /B 2
Set "Fin=%~1"
Set "Fin=%Fin:\=\\%"
For /f "tokens=1* delims=," %%a in ('wmic datafile where "name='%Fin%'" get 'Creation Date' /format:csv') Do (
If /I "%%a"=="%ComputerName%" Set "Df=%%b"
)
>nul Move %1 "%BoxOut%\%~n1`%Df:~0,4%'%Df:~4,2%'%Df:~6,2%`%Df:~8,2%'%Df:~10,2%'%Df:~12,2%%~x1" ||Exit /B 1
EndLocal
Exit /B 0А разделители аккуратненько поставьте свои, или уберите вообще - не смею ограничивать Вашу свободу :)
megaloman, еще раз спасибо.
чем Вас мой код не устроил »
На 100% устроил Код1 (тот, который с процедурой :WRenMask), он уже реально работает в составе моего батника. И это главное :good:.
В теории CMD/BAT я не силен (мягко сказано!) :lamer: , просто мне иногда бывает нужно с помощью CMD/BAT решить конкретную задачу (в простых случаях справляюсь сам).
Ваше сегодняшнее сообщение попытаюсь осилить и еще задам вопросы. :bow:
DJ Mogarych
07-11-2022, 16:55
Переходите на Powershell, там меньше текста осиливать надо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.