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

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

flesh_royal1 17-10-2018 20:35 2836336

Создать скрипт, который выполняет следующее
 
Нужно создать скрипт, который выполняет следующее: на вход пакетному файлу приходит путь к каталогу, дата формата 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 2836345

Цитата:

Цитата flesh_royal1
как мне можно получить файлы, созданные раньше определённой даты »

Код:

forfiles

flesh_royal1 17-10-2018 22:37 2836359

Неужели не существует более краткого решения? Мне нужно выполнить более одной операции над одним и тем же файлом, а forfiles позволяет производить операцию только один раз.
Цитата:

Цитата Busla
forfiles »

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

Iska 18-10-2018 00:19 2836374

Busla, forfiles работает не с датой/временем создания.

Цитата:

Цитата flesh_royal1
Неужели не существует более краткого решения? »

Более краткое решение :lol:
Код:

@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


Цитата:

Цитата flesh_royal1
Спасибо, решение было получено с использованием && »

К сожалению, это не то решение, что требовалось в задании.

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

P.P.S. А если он примет решение с forfiles — то ещё и лопух ;).

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


Время: 20:05.

Время: 20:05.
© OSzone.net 2001-