Я хочу сохранить результат команды как переменную в пакетном окне - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать оператор for /f, чтобы получить результат команды, подобный error : file not found, но этот код %_result% return null

Как получить результат команды?

Вот мой код:

SET CML=forfiles /p %BAKPATH% /M *.zip /D -10 /C "CMD /C del @file"

FOR /F "tokens=* USEBACKQ" %%F IN (
'%CML%'
) DO (
SET _result=%%F
)

echo result = %_result%

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Другой подход заключается в том, чтобы перенаправить stderr (где большинство команд отправляют свои сообщения об ошибках) на stdout, чтобы его можно было перехватить командой for /f.Используя:

@echo off
setlocal
set BAKPATH=.

SET CML=forfiles /p %BAKPATH% /M *.zip /D -10 /C "CMD /C del @file"

FOR /F "tokens=* USEBACKQ" %%F IN (
`"%CML% 2>&1"`
) DO (
SET _result=%%F
)

echo result = %_result%

, где я добавил 2>&1 к вызову команды.Часть 2> говорит, что мы хотим перенаправить дескриптор файла 2 (он же stderr);часть &1 говорит, что нужно перенаправить ее в дескриптор файла 1 (он же stdout).Для защиты символов > и & вся команда заключена в двойные кавычки ("..."), а для соответствия использованию usebackq внешний '...' был изменен на `...`.

При отсутствии подходящего ZIP-файла это дает:

result = ERROR: No files found with the specified search criteria.

, но с одним или несколькими 10-дневными или более старыми ZIP-файлами на месте, это дает пустую строку:

result = 
0 голосов
/ 26 апреля 2019

Ваш вопрос немного неясен, но, похоже, вы хотите использовать реальное сообщение об ошибке и сохранить его как переменную.

@echo off
for /f "delims=" %%a in ('forfiles /p %bakpath% /M *.zip /D -10 /C "CMD /C del @file" 2^>^&1') do set "_result=%%a"
echo %_result%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...