В настоящее время я работаю над пакетным файлом, который должен читать номер версии из другого файла.
По сути, мне просто нужно извлечь строку из другого документа и получить из нее число (число меняется со временем).
set dir=..\folder1\file1.vcxproj
:: I want to get a string from %dir% with a specific beginning and then extract the version number from it
set string=... ("<PlatformToolset>*")
set vernum=... ("..>v142<..)
Вот чего я хочу добиться:
echo %string%
<PlatformToolset>v142</PlatformToolset>
echo %vernum%
142
Надеюсь, я смог описать свою проблему. К сожалению, у меня мало опыта работы с cmd, и мне трудно сформулировать свои мысли в этом отношении.
Я надеюсь, что кто-то еще может помочь :)
dir
— плохое имя для переменной по двум причинам. Сначала dir
— это ключевое слово в пакете, а затем подразумевается, что это каталог, когда он кажется файлом.
Используйте set "var1=value"
для установки значений НИТЬ — это позволит избежать проблем, вызванных пробелами в конце. Кавычки не нужны для установки арифметических значений (set /a
)
Предположим, что вы извлекаете 142
из строки <PlatformToolset>v142</PlatformToolset>
, найденной в файле dir
(пожалуйста, измените это имя)
for /f "tokens=1,2delims=<> " %%b in ('type "%dir%"') do if "%%b"= = "PlatformToolset" set "vernum=%%c"
set "vernum=%vernum:~1%"
обратите внимание, что расположение и тип цитаты ('
или "
) имеют решающее значение.
for
читает каждую строку файла и анализирует эту строку, назначая первый «токен» (1) %%b
, а второй (2) — %%c
.
Линия считается
<последовательность разделителей><token1><последовательность разделителей><token2><последовательность разделителей><token3><последовательность разделителей><token4>
последовательность разделителей — это один или несколько любых символов, указанных в опции delims=
; в данном случае <, > и Space
Итак, где %%a
(токен 1) равен PlatformToolset
, мы хотим присвоить %%c
(токен 2) vernum
поэтому vernum
станет v142
с файлом, содержащим тестовую строку, которую вы опубликовали.
И иероглифы, стоящие за командой set
, объясняются set /?
из подсказки — она принимает значение в vernum
, начиная с «символа 1» (где нумерация символов начинается с 0), и присваивает результат переменной vernum
подробнее о for
гимнастике см. for /?
из подсказки.
хорошо работает. большое спасибо за помощь и разъяснения!