Как извлечь определенную часть каждой строки в списке строк в пакетном скрипте? - PullRequest
1 голос
/ 10 ноября 2019

У меня есть выходные данные команды

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" 

, которые мне нужны:

1) Фильтр для включения только шрифтов TrueType

2) Сократить выводвключить только имя шрифта (все до "(TrueType)")

Возможно ли это сделать, и если да, то как?

Я уже пробовал использовать

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" | 
findstr /I /C:"(TrueType)"

и получил вывод

Arial (TrueType)    REG_SZ    arial.ttf
Arial Black (TrueType)    REG_SZ    ariblk.ttf
Arial Bold (TrueType)    REG_SZ    arialbd.ttf
Arial Bold Italic (TrueType)    REG_SZ    arialbi.ttf
Arial Italic (TrueType)    REG_SZ    ariali.ttf
ect.

, но оттуда я не мог понять, как опустить имена файлов и текст "REG_SZ". Я попытался установить их все переменные с помощью this post

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`reg query 
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" | 
findstr /I /C:"(TrueType)"`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

Но, опять же, это не сработало бы, потому что на каждом компьютере было разное количество шрифтов, поэтому не было заданного количествапеременных для назначения. Кроме того, файлы для каждого шрифта имеют различное количество символов в имени файла, поэтому использование

echo %var1:~,-X%

не будет работать, равно как и обратное

echo %var1:~,X%

Так что, в конечном счете, я 'm обратно на круги своя с

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" | 
findstr /I /C:"(TrueType)"

Есть ли какой-нибудь способ добиться нужного мне результата?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Вот один из способов достижения намеченной цели:

@(For /F Delims^=( %%# In ('^""%__AppDir__%reg.exe" Query^
 "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"^|^
 "%__AppDir__%find.exe" /I "(TrueType)"^|"%__AppDir__%sort.exe"^"'
)Do @For /F Tokens^=* %%$ In ("%%#")Do @Echo(%%$)&Pause

Если вы предпочитаете вывод в текстовом файле, измените &Pause на >"TTF.txt"

0 голосов
/ 10 ноября 2019

Вы можете сделать это, используя цикл for и используя закрывающую скобку в качестве разделителя:

@echo off
setlocal enabledelayedexpansion
for /f "delims=)" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" ^| find /i "TrueType"') do (
   set "str=%%i)"
   echo !str:  =!
)

и если вы не хотите использовать delayedexpansion

@echo off
for /f "delims=)" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" ^| find /i "TrueType"') do (
   set "str=%%i)"
   call echo %%str:  =%%
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...