Войти

Показать полную графическую версию : [решено] Создать скрипт, который выполняет следующее


flesh_royal1
17-10-2018, 20:35
Нужно создать скрипт, который выполняет следующее: на вход пакетному файлу приходит путь к каталогу, дата формата DD.MM.YYYY и второй каталог. Найти файлы в указанном каталоге, созданные раньше указанной даты, скопировать их в другой указанный каталог и добавить в имя файлов дату их создания.

Основной вопрос в том, как мне можно получить файлы, созданные раньше определённой даты? Например, когда я делаю
for /f %%S in ('dir /b') do (
set D=%%~tS
set D=%D:~0, 2%
if %D% LEQ %DT% (
copy %P1%%%~NXS %P2%
)
)

в переменную D у меня ничего не записывается, и строка выводит это как D=~0, 2
Помогите, пожалуйста, пробовал и delayed expansion, вроде как не помогает. Спасибо.

Busla
17-10-2018, 20:53
как мне можно получить файлы, созданные раньше определённой даты »
forfiles

flesh_royal1
17-10-2018, 22:37
Неужели не существует более краткого решения? Мне нужно выполнить более одной операции над одним и тем же файлом, а forfiles позволяет производить операцию только один раз.
forfiles »

Спасибо, решение было получено с использованием && :)

Iska
18-10-2018, 00:19
Busla, forfiles работает не с датой/временем создания.

Неужели не существует более краткого решения? »
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1
set sDestFolder=%~2
set sDateCreatedBefore=%~3

for %%i in ("sSourceFolder" "sDestFolder" "sDateCreatedBefore") do if not defined %%~i (
call :Usage
exit /b 1
)

if not exist "%sSourceFolder%\." (
echo Can't find source folder [%sSourceFolder%].
exit /b 2
)

if not exist "%sDestFolder%\." (
echo Can't find destination folder [%sDestFolder%].
exit /b 3
)

echo %sDateCreatedBefore%|>nul 2>&1 findstr.exe /r /b /e /c:"[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9][0-9]" || (
echo Third parameter [%sDateCreatedBefore%] probably not a date in DD.MM.YYYY template.
exit /b 4
)

set sSourceDrive=%sSourceFolder:~0,2%
set sSourcePath=%sSourceFolder:~2%\
set sDateCreatedBefore4Wbem=%sDateCreatedBefore:~6,4%%sDateCreatedBefore:~3,2%%sDateCreatedBefore:~0,2%

for /f "usebackq delims=" %%i in (
`2^>nul wmic.exe DataFile where "Drive='%sSourceDrive%' AND Path = '%sSourcePath:\=\\%' AND CreationDate < '%sDateCreatedBefore4Wbem%'" get Name /value ^| 2^>nul find.exe /i "Name="`
) do for /f "tokens=2 delims==" %%j in ("%%~i") do (
call :CopyFile "%%~j"
)

endlocal
exit /b 0

:Usage
echo Usage: %~nx0 ^<Source folder^> ^<Destination folder^> ^<Date created before^>
exit /b

:CopyFile
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1

for /f "usebackq delims=" %%i in (
`2^>nul wmic.exe DataFile "%sSourceFile:\=\\%" get CreationDate /value ^| 2^>nul find.exe /i "CreationDate="`
) do for /f "tokens=2 delims==+-." %%j in ("%%~i") do (
set sCreationDate=%%~j
set sNewFileName=%~n1_!sCreationDate:~0,8!%~x1

echo Copy source file [%sSourceFile%] into destination folder [%sDestFolder%] as [!sNewFileName!]
>nul copy /y "%sSourceFile%" "%sDestFolder%\!sNewFileName!"
)

endlocal
exit /b 0


https://i.imgur.com/IesTsXz.png
Спасибо, решение было получено с использованием && »
К сожалению, это не то решение, что требовалось в задании.

P.S. Скажите Вашему преподавателю, что он извращенец альтернативно одарённый человек — давать такие лабораторки бедным студентам.

P.P.S. А если он примет решение с forfiles — то ещё и лопух (https://www.youtube.com/watch?v=HKOQEg7SLfI) ;).

P.P.P.S. WSH, PowerShell — наше всё ;) в данном случае.




© OSzone.net 2001-2012