Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660

Как избавиться от символов \??\ в выводе списка драйверов wmic?

09.03.2016, 18:44. Показов 4020. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую

Есть скрипт:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
 
set TAG=????
 
if "%TAG%"=="????" set /p "TAG=Введите тег для поиска: "
for /f "tokens=2 delims==" %%i in ('"wmic sysdriver get PathName /value"') do (
    for /f "delims=" %%j in ("%%i") do (
        strings "%%~j" | findstr /i "%TAG%">nul && echo %%j
))
echo.
pause
Суть - ищет определенные теги в используемых в данный момент системой драйверах с использованием программы strings

Но в выводе wmic sysdriver get PathName /value иногда попадается вот такое безобразие \??\ (строки 16 и 19)
Пример вывода:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PathName=C:\Windows\system32\drivers\wimmount.sys
 
 
PathName=C:\Windows\system32\drivers\wmiacpi.sys
 
 
PathName=C:\Windows\system32\drivers\ws2ifsl.sys
 
 
PathName=C:\Windows\system32\drivers\WudfPf.sys
 
 
PathName=C:\Windows\system32\DRIVERS\WUDFRd.sys
 
 
PathName=\??\C:\Program Files\Process Hacker 2\kprocesshacker.sys
 
 
PathName=\??\C:\Windows\system32\drivers\myfault.sys
strings такое безобразие игнорирует.


Если убрать \??\, то проблем нет
Вопрос:
Как избавится от \??\ сохранив работоспособность скрипта ?

Заранее благодарю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2016, 18:44
Ответы с готовыми решениями:

Лишняя строка в выводе Wmic
Не очень понял из мануалов, буду благодарен, если кто доступным языком объяснит как выводит (и можно ли это изменить) wmic. На примере...

Как избавиться от погрешности при выводе double?
После того, как считал строку "3,2", перевожу во float, затем складываю с другим числом и получаю хрень непонятную что-то вроде 1,2+2=...

Как избавиться от мерцания при выводе массива?
вообщем есть массив 20x50. и его нужно часто выводит на консоль и происходит мерцание. что можно сделать чтоб его не было?

41
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
09.03.2016, 19:34  [ТС]
Допустим сделал так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
 
set TAG=????
 
if "%TAG%"=="????" set /p "TAG=Введите тег для поиска: "
for /f "tokens=2 delims==" %%i in ('"wmic sysdriver get PathName /value"') do (
    for /f "delims=" %%j in ("%%i") do (
        set STR=%%~j
        set STR=%t:\??\=%
        strings "%STR%" | findstr /i "%TAG%">nul && echo %%j
))
echo.
pause
Есть еще варианты ?
0
 Аватар для b0gus
741 / 339 / 134
Регистрация: 17.03.2014
Сообщений: 842
09.03.2016, 19:40
Лучший ответ Сообщение было отмечено vavun как решение

Решение

может быть, так?
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal EnableDelayedExpansion
set TAG=????
 
rem if "%TAG%"=="????" set /p "TAG=Введите тег для поиска: "
for /f "tokens=2 delims==" %%i in ('"wmic sysdriver get PathName /value"') do (
    for /f "delims=" %%j in ("%%i") do (
    set "t=%%~j" & set "t=!t:\??\=!"
    strings "!t!" | findstr /i "%TAG%">nul && echo %%j
))
echo.
pause
Добавлено через 4 минуты
Цитата Сообщение от vavun Посмотреть сообщение
set STR=%t:\??\=%
здесь у нас значение t неопределено (
+ в цикле for брать значение переменной %name% надо через двойные % и call
1
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
09.03.2016, 19:45  [ТС]
Цитата Сообщение от b0gus Посмотреть сообщение
здесь у нас значение t неопределено (
Да, это опечатка, копировал, видимо, оттуда же, откуда и вы но у себя исправил.
Результат



Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
 
set TAG=????
 
REM if "%TAG%"=="????" set /p "TAG=Введите тег для поиска: "
for /f "tokens=2 delims==" %%i in ('"wmic sysdriver get PathName /value"') do (
    for /f "delims=" %%j in ("%%i") do (
        set STR=%%~j
        set STR=%STR\??\=%
        echo "%STR%"
))
echo.
pause
Цитата Сообщение от b0gus Посмотреть сообщение
+ в цикле for брать значение переменной %name% надо через двойные % и call
Который из for ?
0
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
09.03.2016, 19:48  [ТС]
b0gus, проверил ваш вариант в боевой ситуации, работает, благодарю.

Но от альтернативных вариантов все равно не откажусь
0
 Аватар для b0gus
741 / 339 / 134
Регистрация: 17.03.2014
Сообщений: 842
09.03.2016, 20:09
Цитата Сообщение от vavun Посмотреть сообщение
Который из for ?
в любом!
для for такой "бихавиор":
1. значение переменной, присвоенное этой переменной внутри цикла, извлекается через !name!
2. чтобы сработал п.1, требуется
Windows Batch file
1
setlocal EnableDelayedExpansion
Добавлено через 2 минуты
Цитата Сообщение от vavun Посмотреть сообщение
Но от альтернативных вариантов все равно не откажусь
надо подождать ComSpec
1
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
09.03.2016, 20:16  [ТС]
В общем если кто то решит помочь - на данный момент боевой вариант с подачи b0gus выглядит так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal EnableDelayedExpansion
set TAG=????
 
if "%TAG%"=="????" set /p "TAG=Введите тег для поиска: " & cls
for /f "tokens=2 delims==" %%i in ('"wmic sysdriver get PathName /value"') do (
    for /f "delims=" %%j in ("%%i") do (
        set "t=%%~j" & set "t=!t:\??\=!"
        strings "!t!" | findstr /i "%TAG%">nul && echo !t!
))
echo.
pause
Заранее благодарен
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
09.03.2016, 23:43
Цитата Сообщение от vavun Посмотреть сообщение
Но в выводе wmic sysdriver get PathName /value иногда попадается вот такое безобразие
а покажи вывод
Windows Batch file
1
wmic sysdriver get PathName /format:rawxml
0
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
09.03.2016, 23:47  [ТС]
volodin661, done.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\drivers\Wdf01000.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\DRIVERS\wfplwf.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\drivers\wimmount.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\drivers\wmiacpi.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\drivers\ws2ifsl.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\drivers\WudfPf.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>C:\Windows\system32\DRIVERS\WUDFRd.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>\??\C:\Program Files\Process Hacker 2\kprocesshacker.sys</VALUE>
</PROPERTY>
</INSTANCE>
<INSTANCE CLASSNAME="Win32_SystemDriver"><PROPERTY NAME="PathName" TYPE="string"><VALUE>\??\C:\Windows\system32\drivers\myfault.sys</VALUE>
</PROPERTY>
</INSTANCE>
Как я понимаю полный вывод не требуется, потому вот кусок, где есть и нормальный и "проблемный" вариант.
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
10.03.2016, 01:18
мне не стало легче,
я-то надеялся,
что при выводе в файл,
который, как все мы знаем, по умолчанию в кодировке UTF-16LE,
глупые знаки вопроса заменятся на реальные символы.
0
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
10.03.2016, 01:28  [ТС]
Я вас огорчу, но это знаки вопроса и есть )
Я не знаю что это \??\, но память подсказывает, что я где то когда то что то такое читал это не ошибка.

Для сравнения driverquery /v тоже это выводит вместе с\??\

Гуглиться "это" не хочет (так же яндекситься и duckduckgo-иться)

Единственны раз, где мне ранее встречалось нечто подобное это встроенный mountvol
Посмотрите справку
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
10.03.2016, 02:41
Есть красивое общее решение подобных проблем при выводе wmic
и оно заключается в том, что вместо того, чтобы биться с форматированием вывода после wmic,
самим определять данный вывод, подсовывая wmic свой xml-stylesheet ( по-нашему - файл xsl )

это реализуется с помощью ключа /format:
Windows Batch file
1
wmic computersystem get /format:мойфайл.xsl
какие преимущества:
1) выводится только то, что мне надо ( никаких лишних переводов строки итп )
2) кодировка на выводе только та, что я скажу
3) у XSLT есть свои функции для работы с текстом и числами,
тем самым можно обойти ограничения cmd-интерпретатора при арифметических действиях
4) отделены 'мухи от котлет': командная часть - отдельно, обработка вывода - отдельно.

собственно, я уже писал посты на эту тему,
предлагая майкрософтовский инструментик myxsl.exe в качестве xslt-процессора*,
но тут я вспомнил про HTML-гибриды,
которые совместо с wmic /format:my.xsl позволят всё держать в одном флаконе(bat-файле)
- и командную часть и XSL-таблицу стилей !!

в простейшем виде
ШАБЛОН ВЫГЛЯДИТ ВОТ ТАК:
(а как выглядит в непростейшем можно узнать, взглянув на системные форматы %windir%\system32\wbem\*.xsl)

wmit.bat
( название с претензией на WMI-Template )

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- :
    @ECHO ON
    SET ".xsl=%~n0.xsl"
    COPY /Y "%~f0" "%.xsl%"
    
    wmic computersystem get TotalPhysicalMemory /format:"%.xsl%"
    
    EXIT /B
 
-->
 
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output  omit-xml-declaration ="yes" encoding="windows-1251"/>
 
  <xsl:template match="/" >
    <xsl:value-of select="//VALUE" />
  </xsl:template>
 
</xsl:stylesheet>
в данном случае на выводе будет просто одинокое значение количества памяти в байтах.

3-ей и 4-ой строчек можно было бы избежать,
но wmic хочет, чтобы у формат-файла было обязательно расширение xsl,
приходится копировать данный гибридный bat и переименовывать его в .xsl


Применительно к данному случаю wmic sysdriver get PathName
( много значений VALUE )
шаблон может быть следующим:
vavun.bat
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- :
    @ECHO ON
    SET ".xsl=%~n0.xsl"
    COPY /Y "%~f0" "%.xsl%"
    
    wmic sysdriver get PathName  /format:"%.xsl%"
    
    EXIT /B
 
-->
 
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output  omit-xml-declaration ="yes" encoding="windows-1251"/>
 
  <xsl:template match="/" >
     <xsl:for-each select="//VALUE" >
       <xsl:value-of select="."/>
       <xsl:text>#</xsl:text>
    </xsl:for-each>
  </xsl:template>
 
</xsl:stylesheet>
Разделитель '#' я придумал сам, сам и буду его обрабатывать, если надо.
Если вместо решётки нужен перевод стрококи, то надо подставить & # 10 ;(слитно)

И, наконец, чтобы убрать бяку
vavun.bat
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- :
    @ECHO ON
    SET ".xsl=%~n0.xsl"
    COPY /Y "%~f0" "%.xsl%"
    
    wmic sysdriver get PathName  /format:"%.xsl%"
    
    EXIT /B
 
-->
 
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output  omit-xml-declaration ="yes" encoding="cp866"/>
 
  <xsl:template match="/" >
    <xsl:for-each select="//VALUE" >
      <xsl:choose>
        <xsl:when test="starts-with(., '\??\')">
            <xsl:value-of select="substring-after(., '\??\')"/>
            <xsl:text>& # 10 ;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="."/>
            <xsl:text>& # 10 ;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
 
</xsl:stylesheet>
Несколько замечаний:
1) Если планируется вывод и использование нелатинских символов,
то кодировка данного гибридного bat должна быть UTF-8
2) Очень полезно всё равно иметь под рукой вышеупомянутую утилитку msxsl.exe,
потому что при ошибке в синтаксисе xslt wmic просто тупо отваливается,
а msxsl.exe пишет конкретно, где у вас ошибка.
1
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
10.03.2016, 03:23  [ТС]
Спасибо, но это overengineering.

Не той сложности задача, чтобы носиться с ублажением wmic.
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
10.03.2016, 03:37
Цитата Сообщение от vavun Посмотреть сообщение
Я не знаю что это \??\, но память подсказывает, что я где то когда то что то такое читал

Я предполагал, что это общераспространённый случай работы консольной подсистемы ввода-вывода,
когда не-ASCII символ (код от 128 до 255 ) заменяется на знак вопроса при выводе на экран,
если же вывод идёт в файл, то поведение иное.

Добавлено через 3 минуты
Цитата Сообщение от vavun Посмотреть сообщение
Спасибо, но это overengineering.
нет, это прямо-таки рекомендуемый самoй Microsoft способ общения с WMIC.
0
 Аватар для vavun
10593 / 5556 / 865
Регистрация: 07.04.2013
Сообщений: 15,660
10.03.2016, 03:44  [ТС]
Допустим я хочу выложить этот батник в FAQ.

Мне ссылку на рекомендацию самой microsoft тоже приложить или лучше будет таки обрубить эти жалкие четыре символа и на этом оставить wmic в покое ?



volodin661, То, что вы предлагаете, это хорошо, так может вы напишите подробную заметку о работе с wmic отдельной темой ?
Будет куда полезнее
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
10.03.2016, 03:59
Цитата Сообщение от vavun Посмотреть сообщение
так может вы напишите подробную заметку о работе с wmic отдельной темой ?
собственно, я это уже и сделал, осталось только тему сверху соответствующую прилепить и засунуть в Полезные скрипты, если модератор сочтёт нужным.

мотивация несколько размыта существованием powershell, где доступ к возвращаемым wmi-об'ектам реализован самым естесственным образом.
0
10.03.2016, 04:02  [ТС]

Не по теме:

Цитата Сообщение от volodin661 Посмотреть сообщение
осталось только тему сверху соответствующую прилепить и засунуть в Полезные скрипты, если модератор сочтёт нужным.
С этим вопросом к ComSpec

0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,890
10.03.2016, 04:17
вторым грустным фактором является то,
что функционал MSXML в части XSLT остался на уровне XSLT 1.0
( т.е почти 20-летней давности ),
в то время как сейчас консорциумом W3C закончены работы по реализации стандарта XSLT 3.0,
где всё весьма круто.
https://www.w3.org/TR/xslt-30/
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
10.03.2016, 09:57
Цитата Сообщение от vavun
Есть еще варианты?
На PowerShell есть вариант без использования WMI и strings, так как список загруженных драйверов можно получить через объявленную в сборке System.dll функцию NtQuerySystemInformation, а strings можно написать самому. А если учесть, что PowerShell сценарии можно интегрировать с батами, то смысл плодить на винте кучу сторонних утилит не шибко велик.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
10.03.2016, 13:34
vavun, Чего не так?
Windows Batch file
1
2
3
@echo off
for /f "tokens=2,* delims==?\" %%i in ('wmic sysdriver get PathName /value^|find "="') do echo.%%i%%j
pause
.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2016, 13:34
Помогаю со студенческими работами здесь

Как избавиться от экспоненциального вида при выводе числа
Вот программа, которая вычисляет факториалы чисел от 0 до 20. Факториал для чисел от 10 до 20 представляется в экспоненциальной форме. Как...

Как избавиться от служебных символов в Word-е?
Смысл вот в чем, есть таблица(в Ворде) данные из которой надо обработать. В каждой ячейке таблицы встречается множество служ. символов...

Как избавиться от лишних символов в строке
Помогите,пожалуйста.Битый час ломаю голову. Почему строку p выводит с заколючками? int main() { setlocale(LC_ALL,...

Как избавиться от управляющих символов при чтении из файла?
кто знает как избавиться от управляющих символов при чтении из файла using System; using System.Text; using System.Threading; ...

Как убрать лишние символы при выводе в консоль списка файлов?
Поясните, пожалуйста. Собираю кроссплатформенные методы, для работы с файлами. Взял для разбора такой метод. Всё работает, только вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru