Мне нужно извлечь дату файла, а затем использовать эту строку как часть имени нового файла. Я попытался решить эту проблему с помощью следующих команд:
Сначала я получаю данные о файле и перенаправляю вывод во временный файл.
DIR c:/myfolder/thefile.txt >> tmp.txt
Затем я использую FINDSTR, чтобы получить строку, содержащую дату. Если существует способ получить только дату, я его не нашел:
FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt
Вывод:
10/04/2012 07:55 66,029 thefile.txt
Теперь я хочу присвоить этот результат переменной:
SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt
Кажется, это сработало, потому что когда я ввожу %vartmp%, возвращается результат:
10/04/2012 07:55 66,029 thefile.txt
Но когда я пытаюсь извлечь часть vartmp, начинаются проблемы:
ECHO %vartmp:~0,2%
Он возвращает мне строку «FI», когда я ожидал «10». Похоже, vartmp сохраняет выражение, а не результат выражения. Я пытаюсь присвоить результат выражения другой временной переменной, а затем извлечь подстроку временной переменной, но ничего не меняется.
решение1
Команда FOR может использоваться для разбиения строки на токены, чтобы вы могли взять только нужную часть. С помощью /f вы можете запустить ее на выводе других команд, в данном случае на выводе DIR, отфильтрованном с помощью FIND.
for /f "tokens=1" %%a in ('dir thefile.txt ^| Find "thefile.txt"') do (
set vartmp=%%a
)
решение2
Это не идеально, но может измениться SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt
на
FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt > tmp2.txt
SET /p vartmp =< tmp2.txt
DEL tmp2.txt
решение3
Следуя вашим примерам, я обнаружил тот же результат, однако, если бы я заменил строку:
SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt
с
for /f %i in ('FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt') do set vartmp=%i
тогда vartmp содержит то, что вы ищете. Обратите внимание, что вам нужны одинарные кавычки, двойные кавычки не подойдут. Также, если вы используете в пакетном файле, вам нужно %%i вместо %i