Если файл старше X дней -> запустить команду - CMD - PullRequest
0 голосов
/ 25 октября 2019

Я пишу скрипт для запуска DriveSnapshot в различных версиях Windows Server. Я хочу запустить определенный пакетный файл (fullbackup), если в папке есть файл старше 6 дней. Если таких файлов нет -> запустите дифференциальную резервную копию.

Я попытался:

ForFiles /p "path\to\folder" /d -6 /c "cmd /c set var=1"
if %var% == 1 (
   fullbackup.bat
) else (
   diffbackup.bat
)

Но, похоже, вы не можете просто запустить какую-либо команду в ForFiles.

Кажется, переменной никогда не присваивается правильное значение.

Страница Microsoft Docs для ForFiles гласит:

Запускает указанную команду для каждого файла. Строки команд должны быть заключены в кавычки. *

Я знаю, что моя команда будет set var=1 для каждого найденного файла, но все равно должна работать, верно?

Если есть какие-либолучший способ решить эту проблему, пожалуйста, просветите меня ...

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Командная строка за ключом /C команды forfiles не запущена на хосте cmd экземпляр , вы даже явно создаете новый(cmd /C).

Но существует более простой подход, использующий код выхода forfiles вместе с операторами условного выполнения && и ||:

forfiles /P "D:\path\to\folder" /D -6 > nul 2>&1 && (
    "D:\path\to\fullbackup.bat"
) || (
    "D:\path\to\diffbackup.bat"
)

Обычно я рекомендую использовать call для запуска другого пакетного файла из пакетного файла, но здесь в этом случае я намеренно пропустил его, потому что call "fullbackup.bat" может вернуть код выхода изпакетный файл сам по себе, который может быть непреднамеренно распознан ||.

Если вам нужно использовать call, когда следуют другие команды, я бы использовал это:

forfiles /P "D:\path\to\folder" /D -6 > nul 2>&1 && (
    call "D:\path\to\fullbackup.bat" & goto :NEXT
) || (
    call "D:\path\to\diffbackup.bat"
)
:NEXT

Обратите внимание, что forfiles также перебирает каталоги, а не только файлы.

0 голосов
/ 25 октября 2019

Вместо этого используйте errorlevel, так как ваш текущий скрипт устанавливает переменную вне вашей среды сценариев, и она никогда не передается обратно родительскому сценарию.

ForFiles /p "z:\work" /d -100 /c "cmd /c">nul 2>&1
if errorlevel 1 call diffbackup.bat else call fullbackup.bat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...