Другой подход заключается в том, чтобы перенаправить 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 =