Как-то раз мне потребовалось создать пакетный файл, который сообщал бы мне о том, успешно ли выполняется соединение с Интернетом. Вначале я подумал, что начну с отправки одного запроса ping к определенному серверу DNS в Интернете, а затем перенаправлю вывод данных в текстовый файл, при этом извлекая время движения пакета туда и обратно в миллисекундах и показывая результаты (я подумал, что пакетный файл мог бы запускаться в маленьком текстовом окне, если бы я минимизировал вывод данных). Но как я могу использовать только определенный кусочек текста из всех данных, выводимых приложением? Команда Setx дает ответ на этот вопрос.

. Затем команда позволяет идентифицировать отдельное слово, которое вы хотите извлечь при помощи двух координат: строка, где оно найдено, и расположение самого слова в этой строке. Setx считает начиная с нуля, а не с единицы, таким образом, координаты, предписывающие Setx извлечь пятое слово в третьей строке, будут (4,2).

Setx полезна для извлечения слов из текстовых файлов, которые имеют правильную структуру, такую как перехваченный вывод данных команды Ping (я также использовал ее для захвата данных от Ipconfig). Команде для работы нужен текстовый файл, поэтому я создал его, выполнив опрос с ping своего сайта при помощи следующей команды:

ping -n 1 www.minasi.com>pr.txt

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

setx/f pr.txt/x

которая заставляет Setx делать дамп всех слов, которые команда может найти в тексте, вместе с их координатами. Например, вывод данных может выглядеть так:

(2,0 Reply)(2,1 from)(2,2 70.165.73.5:)(2,3 bytes=32)
   (2,4 time=30ms)(2,5 TTL=113)

Строка показывает, что во фразе Reply from 70.165.73.5: bytes=32 time=30ms TTL=113, Setx нашла шесть «слов»: Reply, from, 70.165.73.5:, bytes=32, time=30ms и TTL=113. Единственное, что мне нужно, time=30ms, имеет префикс 2,4, то есть это четвертое слово в третьей строке. Теперь у меня есть информация, которую нужно сообщить Setx, чтобы принять перехваченный вывод данных команды Ping, извлечь интервал времени и вставить его в переменную среды, которую я назову rtt:

setx rtt /f pr.txt /a 2,4

Ответ будет:

Extracted value: time=30 ms.
SUCCESS: Specified value was saved.

Это позволит поместить time=30 ms в переменную среды rtt, и, может быть, ничего другого мне не нужно. А если мне не требуется часть time=? Как вы догадались, «слово» в Setx — это набор символов, окруженных началом строки, пробелом или концом строки (набор также использует табуляцию как разделители слов). Чтобы удалить 30 из time=30ms, я использую параметр /d команды Setx для распознавания дополнительных разделителей (то есть знак равенства и букву m):

setx rtt /f pr.txt /d "m","=" /a …

Но параметру /a нужны координаты, и я немного реорганизую всю систему координат. Как я определю, где показывается 30 с этими новыми разделителями? Воспользуемся командой /x, но на этот раз с разделителями:

setx /f pr.txt /d "m","=" /x

Эта команда выдает настоящий водопад данных. Чтобы сократить немного вывод, я могу отфильтровать все строки, кроме тех, которые содержат цифру 30. Например, так:

setx /f pr.txt /x /d "=","m" | findstr "30"

Таким образом, получим две строки:

(2,0 Reply)(2,1 fro)(2,2 70.165.73.5:)(2,3 bytes)(2,4 32)
   (2,5 ti)(2,6 e)(2,7 30)(2,8 s)(2,9 TTL)(2,10 113)
(7,0 Mini)(7,1 u)(7,2 30)(7,3 s)(7,4 Maxi)(7,5 u)(7,6 30)
   (7,7 s)(7,8 Average)(7,9 30)(7,10 s)

Число 30, которое я ищу в первой из этих строк, есть, но его очень сложно прочесть, потому что Setx удалил букву m, но координаты, которые мне нужны, это (2,7).

Теперь у меня есть команда, которая вытягивает интервал времени:

setx rtt /f pr.txt /d "m","=" /a 2,7

И наконец, я получаю результат:

Extracted value: 30.
SUCCESS: Specified value was saved.

Если вы ищете нечто, состоящее из нескольких битов информации, и не хотите писать сценарий, попробуйте использовать Setx. Эта команда поможет сберечь ваше время.

Марк Минаси (www.minasi.com/gethelp) — старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft

Поделитесь материалом с коллегами и друзьями

Купить номер с этой статьей в PDF