Windows cmd вывод команды в переменную

Обновлено: 01.07.2024

Команда SET без параметров используется для вывода текущих значений переменных среды.

Кроме переменных, отображаемых в списке, при вызове команды SET, существуют и другие, значения которых изменяется динамически:

Если при вызове команды SET указать только часть имени, то будет выведен список переменных, имена которых начинаются с указанной строки. Например:

Команда SET поддерживает два дополнительных ключа:

SET /A выражение

SET /P variable=[promptString]

Ключ /A указывает, что строка справа от знака равенства является числовым выражением, значение которого вычисляется. Обработчик выражений очень прост и поддерживает следующие операции, перечисленные в порядке убывания приоритета:

При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда SET /A вызывается из командной строки, а не из пакетного файла, она выводит окончательное значение выражения. Слева от любого оператора присваивания должно стоять имя переменной среды. Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс:

Пример использования префиксов:

SET /A REZ=0xA+012
ECHO %REZ%

В данном командном файле значение переменной REZ вычисляется сложением числа 10, представленного в шестнадцатеричном виде ( 0xA ) и числа 10 , представленного в восьмеричном ( 012 ).

Ключ /P позволяет установить значение переменной для входной строки, введенной пользователем. Показывает указанное приглашение promptString перед чтением введенной строки. Приглашение promptString может быть пустым. Данный ключ позволяет организовать диалог с пользователем в командном файле:

В командных файлах довольно часто требуется работать с частью значения, принимаемого переменной, для чего используются подстановочные значения:

Следующий командный файл использует замену символа "точка" на символ "тире" в значении переменной, соответствующем текущей дате:

@ECHO OFF
set tm=%DATE%
ECHO Дата1 = %tm%
SET tm=%DATE:.=-%
ECHO Дата2 = %tm%

Для выделения части значения, принимаемого переменной, используется следующая конструкция:

Следующий пример использует отображение текущего времени без секунд и долей секунд (только первые 5 символов из стандартного значения переменной TIME):

@ECHO OFF
set tm=%TIME%
ECHO Время1 = %tm%
SET tm=%TIME:

0,5%
ECHO Время2 = %tm%

Если значение y ( длина ) не указана, то используется оставшееся до конца строки значение переменной. Если значение y отрицательно, то используется часть строки значения переменной от конца. Предыдущий пример можно изменить , указав, что в принимаемом значении времени отбрасываются 6 символов от конца:

@ECHO OFF
set tm=%TIME%
ECHO Время1 = %tm%
SET tm=%TIME:

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

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

0,-2% эквивалентно %PATH:

При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой :

Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:

Setlocal EnableDelayedExpansion
@ECHO OFF
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR!
)

Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в подпрограмму ). Аналогичная же проблема наблюдается и тогда, когда значение переменной изменяется внутри цикла команды FOR . Например, для получения списка файлов текущего каталога такой командный файл не будет работать:

set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%

Значение переменной LIST внутри цикла изменено не будет. Для того, чтобы это произошло, командный файл нужно изменить следующим образом:

Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%

Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i )

ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ

Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl

Вывод на экран, в файл текста без перевода строки

В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
b.txt

Вычисление длины строковой переменной

В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:

1 :startvarcount if not defined var exit /b set var=%var:

1% set /a %2+=1 goto startvarcount exit /b

Еще один вариант вычисления длины строковой переменной:

1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:

%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop

n0.tmp") Do Set /A z=%%

Ну и, наконец, решение, поразившее меня своей математической лаконичностью:

1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avo SET /a %

Для себя я так же использую метод половинного деления для нахождения количества символов в строке. Эта процедура менее изящна, и, возможно, потребует несколько большего времени для вычислений, чем приведенная выше, но, на мой взгляд, она понятнее. (В этом месте надо было похвалить себя еще, но что-то не нашлось достойных эпитетов)
Привожу на всякий случай и эту процедуру ))

!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %

2=%mmin% EXIT /b %mmin%

Получение подстроки.

Или как вариант предыдущего

Удаление ведущих и замыкающих пробелов.

%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez=") else (set rez=!%1:

Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.

Cmd работа с переменными

Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:

В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу "Привет Мир. "

Стоит учитывать один момент, запись

это не одно и тоже, то есть, в первом случае мы создаем cmd переменную "var1", а во втором – "var1 ". С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел.

Видим, что бы вывести значение переменной с помощью функции Echo, мы заключаем ее в символ "%", для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.

Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. Мы сможем обращаться к ним на протяжение всего сеанса работы.

Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:

Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:

просто выведет строчку %Var3%, а команда

Стоит учитывать тот момент, что если мы хотим, что бы переменная командной строки Windows содержала специальные символы (например, @ & | ^ ), то их нужно экранировать. В языке jscript для вывода специальных символов используются esc-последовательности, в командной строке специальный символ экранируется с помощью "^":

В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:

"100 & 3 = 5"
"100 ^3"

Стоит обратить внимание, что если мы попытаемся вывести значения данных переменных с помощью функции cmd set, то проблем не возникнет, но если будет использовать функцию echo, то получим совсем не тот результат, что ожидали. Так, при попытке выполнить следующую команду:

100
"3" не является внутренней или внешней командой, исполняемой программой или командным файлом.

Это происходит из-за повторного анализа спец-символов при использовании функции echo. Надо просто прописать символ "^" экранирования не один раз, а трижды:

Теперь при выполнении кода:

все пройдет успешно.

Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.

Область видимости – блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью "Урок 3 по JScript: Объявление пользовательских функций".

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

Cmd работа с переменными

Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL . Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++, так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:

Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL . В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.

Спасибо за внимание. Автор блога Владимир Баталий

Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

Чтобы получить полный список переменных и их значений введите команду SET


Операции со строковыми или численными переменными

Соединение 2-ух строковых переменных

Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!

В данном случае: если кавычки в начале и конце строки - можно юзать

Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

Первый способ с call set


Второй способ с for и setlocal enabledelayedexpansion

писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.


Операции с числовыми переменными

Увеличивание на единицу


Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)

Унарные операторы

Логическое отрицание (Logical NOT)

дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях

Унарный минус (устанавливает/сбрасывает знаковый бит)

Побитовое И (AND)

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

Побитовое ИЛИ (OR)

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

Побитовое исключающее ИЛИ (XOR)

Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.

К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

Двоичный арифметический сдвиг

Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием. )
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.

Системы счисления

Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.

Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.

Восьмеричная система счисления

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

Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
Поэтому можно воспользоваться временным сохранением в файл:

Примеры использования
Узнать динамически генерируемое имя архива WinRar:

Комментарий от Dragokas :
По сути эта команда считывает в переменную первую строку файла:

Комментарий от m00slim25 :
Эти операции, как и все остальные, поддерживают кавычный синтаксис:

Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.

Dragokas

Very kind Developer
Урезание части строки, замена значения в переменной:

Var_Replacing.jpg

Ограничение - будет модифицирована переменная. Следует выбрать переменную, модификация которой не нарушит работу скрипта или использовать setlocal / endlocal.

Undocumented Dynamic variables (read only)

%__CD__% текущий каталог, с бэкслэшем '\' в хвосте;
%=C:% Текуший каталог на диске C:
%=D:% Текуший каталог на диске D:,E:,F. (буковку подставите), если к нему было обращение в текущем сеансе CMD.EXE
%=ExitCode% Шестнадцатеричное значение кода возврата по EXIT /B
%=ExitCodeAscii% Символьное (ASCII) представление кода возврата по EXIT /B, если он больше 32 (пробел).

Dragokas

Very kind Developer

Полезные функции


Получить уникальное имя файла во временной папке
Мы знаем, что переменная %RANDOM% выводит значение в области от 0 до 32767,
а что если нам нужно диапазон уже, к примеру от -50 до 50? Вот решение:
Как известно в бат-файлах есть только операция целочисленного деления
и получения остатка от деления. Получить дробное число нельзя. Решил восполнить этот пробел:
Алгоритм получения дробной части:
Остаток от деления * (10^(знаков после запятой)) / делитель.
Потом убираются лишние концевые нули у дробной части.

Отличие от встроенного в CMD деления: исходное число (делимое) может превышать границу для числового типа данных CMD
(актуально для Гигабайтов данных, представленных в виде байтов, для дальнейшего перевода в более удобо-читаемую единицу измерения).

Пример довольно прямолинеен, и не оптимизирован. Зато работает верно, надеюсь Логические операции сравнения для чисел, превышающих арифметику CMD
Перевод чисел из десятеричной системы в любую (2-16)
1. Простой вариант - проверка на содержимое в строке заданной подстроки

Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
Не работает с пустыми строками.

2. Вариант, когда подстрока тоже в переменной

Пример использования и функция:

Получение N-й строки из файла без использования (!) - DelayedExpansion

Talory

Новый пользователь
Здравствуйте, не совсем понял про шестнадцатеричную систему. Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе. Как это будет выглядеть в bat?

Dragokas

Very kind Developer

О какой части статьи идёт речь?

Talory

Новый пользователь
Про системы счисления. Хочу через bat файл в реестре сделать изменения в значении файла. Необходимо внести нынешнию дату в шестьнадцатеричной системе

Dragokas

Very kind Developer
Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе.

В общем случае, перевод с 10-СС в 16 будет через Batch выглядеть так:

JAXSWAGGER

Новый пользователь
Здравствуйте, а как я могу сделать, что бы система проверяла меньше ли числовая переменная определенного числа? Я не нашел данного в статье

Dragokas

Very kind Developer

IF [/I] строка1 оператор_сравнения строка2 команда

EQL - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,

JAXSWAGGER

Новый пользователь
Выдает ошибку и закрывается мгновенно
IF /i A EQL 70 (echo test)
В чем моя ошибка?

Dragokas

Very kind Developer

Похоже, ошибка во встроенной документации.

Вместо EQL должно быть EQU
/i - не нужна т.к. у вас сравнение математическое, а не текстовое
Переменную нужно подавать в раскрытом виде:

Второй вариант с кавычками безопаснее, если сравниваете строки.

Переменную можно не раскрывать только в математических операциях при участии оператора set /a

m00slim25

Новый пользователь

Заметил несколько ошибок:

>> Логическое отрицание (Logical NOT)

дает результат (%y%) 1 (True), если переменная(%x%) равна 0 (False),
и 0 (False) (%y%) в любых других случаях
>> Побитовая инверсия (Bitwise NOT)
>> Может неправильно инвертировать знаковый бит

>> Унарный минус (устанавливает/сбрасывает знаковый бит)

Эти операции, как и все остальные, поддерживают кавычный синтаксис:

m00slim25

Новый пользователь
Второй вариант с кавычками безопаснее, если сравниваете строки. Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы из скобок не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.

Dragokas

Very kind Developer

Спасибо за комментарии, дополнил.

m00slim25

Новый пользователь

При использовании нетривиальных вычислений. Например, в случае переполнения при использовании операторов битового сдвига. Эти операторы просто не определяют переполнение, вследствие чего последующая побитовая инверсия даёт ошибочный результат.

ЗЫ. Только не просите примеры, они где то далеко и глубоко закопаны Да Вы и сами можете исследовать эту особенность, это несложно
ЗЫЫ. Любой, кто использует вычисления подобного рода в командной оболочке, способен самостоятельно расследовать подобные инциденты, выявить причину ошибочных результатов, и принять меры, чтобы избежать этих инцидентов. Я привёл тот комментарий лишь для информативности: знание - сила. Можете игнорировать его, если он Вас каким-либо образом напрягает.

Dragokas

Very kind Developer

Да, верю. Я проверил побитовую инверсию на максимальных числах и у меня всё посчитало правильно.
Но если речь о битовых сдвигах, ещё и переполнении, то тогда всё понятно.

Есть задача получить скриптом некоторые smart атрибуты.
Смарт получаю через запуск Smartmontools

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

работает как при запуске без параметров, потому что параметров как бы и нет, они в кавычках не воспринимаются.
весь вывод загнать в переменную не получится, разве что одну строку из вывода.
но в приведенном примере туда попадет только одна строка (последняя), ибо переменная report при каждой итерации будет перезаписываться. Если нужно гонять именно весь вывод, а не какую-то конкретную строку, то можно использовать перенаправление вывода в файл, и парсить уже его, например.
или выдергивать нужные строки прямо сразу из вывода, и если нужно совать в переменную

Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

На выходе этой команды будет много строк, хочу весь вывод загнать в переменную, которую буду парсить и выбирать нужные значения.
Не получается вывод команды передать в переменную »
Можно загнать не в одну переменную, а во множество, например, переменных с номерами в именах. У меня нет Вашей программы smartctl.exe, привожу пример с командой Dir. Забираю каждую строку выдачи команды Dir в переменные @_1001 @_1002 . а затем выдаю их на экран. Как уж с значениями этих переменных поступать - дело Ваше.

Идею подсмотрел у alpap

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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Последний раз редактировалось megaloman, 20-11-2018 в 16:23 .

Конфигурация компьютера
Процессор: Intel(R) Core(TM) i3 CPU M 370 2.40GHz, ядер: 2, логических процессоров: 4
Память: 8,00 ГБ
ОС: Windows 10 Pro x64
вот тут подробнее
согласен с megaloman и Elven, что помещать весь вывод (особенно из нескольких строк) в одну переменную это и сложно и неудобно и чревато, тут или действительно через файл или почему нельзя распарсивание вывода сразу поместить в код, давайте целиком задачу. Вот еще вариант попеременного вывода, при большом количестве строк с него нет также никакого толку (надо сразу разбирать)
Если нужен весь вывод с последующим парсингом — я бы вообще работал с WSH/PoSH, наподобие:

И потом парсите полученный в strOutput вывод как душеньке будет угодно, в том числе и регулярками.

PS или WSH нельзя по условиям задачи. Скрипт будет запускаться в ограниченной среде, где WSH/PoSH запрещен или отсутствует.

Задача: посредством Smartmontools снять смарт атрибуты и передать их в ПО мониторинга. Хотелось бы вывод

=== START OF INFORMATION SECTION ===
Model Family: SandForce Driven SSDs
Device Model: SanDisk SDSSDA120G
Serial Number: 162213353535
LU WWN Device Id: 5 001b44 4a4a8b409
Firmware Version: Z22000RL
User Capacity: 120*034*123*776 bytes [120 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Form Factor: 1.8 inches
Device is: In smartctl database [for details use: -P show]
ATA Version is: ACS-2 T13/2015-D revision 3
SATA Version is: SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Wed Nov 21 10:00:41 2018 RTZ
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x05) Offline data collection activity
was aborted by an interrupting command from host.
Auto Offline Data Collection: Disabled.
Self-test execution status: ( 25) The self-test routine was aborted by
the host.
Total time to complete Offline
data collection: ( 0) seconds.
Offline data collection
capabilities: (0x71) SMART execute Offline immediate.
No Auto Offline data collection support.
Suspend Offline collection upon new
command.
No Offline surface scan supported.
Self-test supported.
Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0002) Does not save SMART data before
entering power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 10) minutes.
Conveyance self-test routine
recommended polling time: ( 2) minutes.

SMART Error Log Version: 1
No Errors Logged

SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Я хочу получить результат команды в виде переменной в пакетном сценарии Windows (см., Как получить результат команды в bash для эквивалента сценария bash). Решение, которое будет работать с файлом .bat, является предпочтительным, но также приветствуются другие распространенные решения сценариев Windows.

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

Если вам нужно захватить весь вывод команды, вы можете использовать такой пакет:

Все выходные строки сохраняются в VAR, разделенные знаком "!".

@John: есть ли в этом практическая польза? Я думаю, вам стоит посмотреть PowerShell или любой другой язык программирования, способный легко выполнять скриптовые задачи (Python, Perl, PHP, Ruby).

Ответ в одну строку решит конкретный случай, который у меня есть. Я просто подумал, что есть вариант с несколькими строками (или более простой вариант с одной строкой). Я думаю, возможности файлов bat не так уж велики. Это необходимо для сценариев летучих мышей, обертывающих приложения Java. В основном создание путей к классам. Будьте с этим очень осторожны. GWT также пытался использовать командные файлы для запуска Java с определенными путями к классам, что ужасно провалилось, как только вы попали в каталоги с символами, отличными от ASCII (в этом случае это был мой дом :)). С тех пор они переписали это с помощью VBS. есть ли в этом практическая польза? Ты смеешься? Это постоянно используется в других оболочках (думаю, во всех оболочках GNU / Linux), и это очень полезно. @PiotrDobrogost Я думаю, что он пытался сказать, что сценарии bash - это ужасный пережиток прошлого (вам нужно использовать цикл for только для захвата вывода программы? Серьезно?), И если вы когда-нибудь дойдете до сути там, где вам нужно использовать переменные, вам следует использовать что-то более современное, например PowerShell. Практическое применение, собственно, есть . вроде как. Я хочу использовать сценарий PowerShell, чтобы найти конкретный путь к Visual Studio, но то, что мне нужно из этого пути, - это пакетный файл, который устанавливает кучу переменных env, поэтому я могу вызвать editbin . Итак, мне нужно найти путь и вернуть его вызывающему экземпляру, cmd чтобы я мог запустить его там. . Да, это ужасно, как звучит. Visual Studio иногда заставляет меня плакать. @ Ajedi32 Я думаю, вы хотели сказать, что пакетные скрипты - это ужасный пережиток прошлого. ;)

Скромный командир за годы накопил несколько интересных способностей:

Чтобы записать конвейерное выражение, используйте ^| :

Как и в случае с ответом @PabloG, это будет работать только для получения последней строки вывода команды, в данном случае «date / t». Я обнаружил, что ваш ответ работает только тогда, когда я использовал двойные знаки процента, то есть FOR /F "delims text-muted font-weight-lighter"> — Rabarberski @Rabarberski: Если вы вводите for команду прямо в командной строке, вы используете одиночный % . Если вы используете его в пакетном файле, вы используете %% . @tardate: Не могли бы вы рассказать, как будет выглядеть скрипт, если команде нужно передать аргумент % , например: for /f "delims text-muted font-weight-lighter"> — dma_k @degenerate Команда действительна при условии, что date используемая команда исходит от Cygwin. Я согласен, я должен был упомянуть об этом.

Чтобы получить текущий каталог, вы можете использовать это:

Хотя он использует временный файл, поэтому он не самый красивый, но, безусловно, работает! «CD» помещает текущий каталог в «tmpFile», «SET» загружает содержимое tmpFile.

Вот решение для нескольких строк с "массивом":

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

Есть ли вариант, который будет работать для захвата нескольких строк из команды? Чтобы получить текущий каталог, вы можете использовать echo% CD%

У этой ссылки есть команда " Set /P _MyVar=<MyFilename.txt ", которая говорит, что она будет установлена _MyVar на первую строку из MyFilename.txt . Это может быть использовано как myCmd > tmp.txt «с set /P myVar=<tmp.txt ». Но он получит только первую строку вывода, а не весь вывод

В этой ссылке есть команда «Set / P _MyVar = <MyFilename.txt», которая говорит, что она установит _MyVar на первую строку из MyFilename.txt. Его можно использовать как «myCmd> tmp.txt» с «set / P myVar = <tmp.txt». Но он получит только первую строку вывода, а не весь вывод. Этот ответ предназначен для таких начинающих, как я

Пример установки в переменной среды "V" самого последнего файла

в пакетном файле вы должны использовать двойной префикс в переменной цикла:

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

Просто используйте результат FOR команды. Например (внутри командного файла):

  • Это вызовет себя с результатом команды CD, так же, как pwd.
  • Извлечение строки по параметрам вернет имя файла / папку.
  • Получите содержимое этой папки и добавьте в filename.txt

[Кредиты] : Спасибо всем остальным ответам и некоторым копаниям на странице команд Windows XP .

Спасибо за ответ! Хотя фрагмент кода может ответить на этот вопрос, все же здорово добавить дополнительную информацию, например, объяснить и т. Д.

К приведенным выше решениям я хотел бы добавить замечание:

Все эти синтаксисы работают отлично, ЕСЛИ ВАША КОМАНДА НАЙДЕНА В ПУТИ или ЕСЛИ КОМАНДА ЯВЛЯЕТСЯ cmdpath БЕЗ ПРОБЕЛОВ ИЛИ СПЕЦИАЛЬНЫХ СИМВОЛОВ.

Но если вы попытаетесь использовать исполняемую команду, расположенную в папке, путь которой содержит специальные символы, вам нужно будет заключить путь к вашей команде в двойные кавычки ("), и тогда синтаксис FOR / F не будет работать.

В этом случае единственное решение, которое я нашел для использования команды и сохранения ее результата в переменной, - это установить (временно) каталог по умолчанию для самой команды:

Тогда результат правильный:

Конечно, в приведенном выше примере я предполагаю, что мой пакетный сценарий находится в той же папке, что и одна из моих исполняемых команд, так что я могу использовать синтаксис «%

p0». Если это не ваш случай, вам нужно найти способ найти путь к вашей команде и изменить каталог по умолчанию на его путь.

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

Читайте также: