Как настроить вывод команд в виде переменной в командном файле

243

Можно ли установить вывод оператора пакетного файла в переменную, например:

findstr testing > %VARIABLE%

echo %VARIABLE%
Деннис
источник
2
возможный дубликат Пакетного эквивалента обратных
ударов
На самом деле, кажется, оригинал Как я могу получить результат команды в переменной в Windows? ,
Кристиан Чиупиту
Еще один дубликат просто для удовольствия: пакетное назначение Windows переменной программы для вывода
icc97
1
Возможный дубликат Как получить результат команды в переменной в Windows?
Дэйв Джарвис

Ответы:

275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

Я всегда использую USEBACKQ, так что если у вас есть строка для вставки или длинное имя файла, вы можете использовать двойные кавычки, не испортив команду.

Теперь, если ваш вывод будет содержать несколько строк, вы можете сделать это

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL
Mechaflash
источник
3
Работал у меня в системе Win7, спасибо! (и да, это 7 лет полезности) PS Не забывайте расширять% до %% в командах!
Дмитрий Илухин
Это прекрасно работает ... если вывод не содержит восклицательных знаков (!), Так как они будут интерпретироваться как управляющие символы при использованииENABLEDELAYEDEXPANSION
JonathanDavidArndt
Это работает хорошо, за исключением случаев, когда вам нужно использовать, |в этом случае это не работает.
Мэтт Вукоманович
6
@MattVukomanovic он работает ^|вместо меня |, как описано здесь
AST
Можно ли как- commandнибудь захватить код выхода , пожалуйста? Я уверен, что он возвращает ненулевой код, но %ERRORLEVEL%всегда содержит 0, независимо от того, где я пытаюсь его использовать (даже внутри doблока). Поэтому я думаю, что некоторая часть этой forконструкции перезаписывает ее. Кстати, невероятно, насколько безумно выглядящий код нужен для чего-то столь элементарного.
Дэвид Ференци Рогожан
69

Я нашел эту тему на этой вещицкой паутине. Сводится к:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

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

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Кредит на ветку на аппаратном обеспечении Тома.

Dolphy
источник
3
Единственный недостаток подхода снизу (который предпочтителен во всех других отношениях) заключается в том, что он не работает с многострочным выводом.
dgo
Для VER я бы пошел другим путем: для / f "tokens = 2 delims = [,]" %% a in ('ver') установить версию %% a echo% version%
Hardoman
1
ты второй результат для лайковучабы - imagebin.ca/v/4NPSlQFgifce
Шмуэль Каменский
Ваш второй пример очень помог мне в написании командного файла для проверки версии chromedriver.exe по сравнению с текстовым файлом, содержащим номер версии. Я старый DOS-динозавр и не знал о переключателях команды set. Другие вещи были для меня излишни.
Билл Хайлеман
47

в одну строку:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

вывод команды будет установлен в% g, затем в VAR.

Дополнительная информация: https://ss64.com/nt/for_cmd.html.

Юрий
источник
19
Моя партия не запускалась с "% g". Это бежало с "%% g".
Сантьяго Вильяфуэрте
5
+ Santiago Villafuerte: да, если вы запускаете из пакетного файла, но если вы хотите запустить его из командной строки самостоятельно (например: проверить его перед помещением в пакетный файл), тогда вы используете один%.
Брент Риттенхаус
19

Читать файл ...

set /P Variable=<File.txt

Написать файл

@echo %DataToWrite%>File.txt

нота; пробелы перед символом <> приводят к добавлению пробела в конец переменной, также

Чтобы добавить в файл, как программа-регистратор, сначала создайте файл с одним ключом ввода, который называется e.txt.

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

ваш журнал будет выглядеть так

Entry1
Entry2 

и так далее

В любом случае пара полезных вещей


источник
Спасибо за ваш ответ. Кстати, "set / P Variable = <File.txt" читает только первую строку файла
Deepscorn
19

Эти ответы были настолько близки к ответу, что мне был нужен. Это попытка расширить их.

В пакетном файле

Если вы работаете из .batфайла и вам нужна одна строка, которая позволяет вам экспортировать сложную команду, например, jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonв переменную с именем, AWS_ACCESS_KEYтогда вы хотите это:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

В командной строке

Если вы в C:\приглашении хотите одну строку, которая позволяет вам выполнить сложную команду, например, jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonдля переменной с именем, AWS_ACCESS_KEYтогда вы хотите это:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

объяснение

Единственное различие между двумя ответами выше состоит в том, что в командной строке вы используете один% в своей переменной. В пакетном файле вы должны удвоить процентные знаки (%%).

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

Райан Шиллингтон
источник
13

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

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

Если вы хотите заключить строку поиска в двойные кавычки:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

Если вы хотите сохранить этот код в пакетном файле, добавьте дополнительный символ%:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

Полезный пример для подсчета количества файлов в каталоге и хранилище в переменной: (иллюстрирует трубопровод)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

Обратите внимание на использование одиночных кавычек вместо двойных кавычек "или грависа` в командных скобках. Это чиста альтернатива delims, tokensили usebackqв forцикле.

Проверено на Win 10 CMD.

Zimba
источник
1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause
цоколь
источник
Я не вижу, как это решает вопрос. appcmdне является стандартной программой, и я не вижу, где вы назначаете программный вывод переменной. В конце концов вам нужно еще несколько объяснений
Джеб
-3

Я проверил это так, и это сработало:

SET /P Var= | Cmd

Путем передачи команды в переменную, запрос вставит результат команды " Cmd" в переменную " Var".

Обновить:

Это не работает, мой плохой, сценарий, который я сделал, был таким:

SET /P Var= | dir /b *.txt
echo %Var%

На самом деле он показывал, скажем, « test.txt», но на самом деле показывал результат команды « dir /b *.txt», а не echo %var%. Я запутался, так как оба выхода были одинаковыми.

QcAlexN
источник
3
Если вы намеревались, pipe the command into a variable promptто вы должны были написать это, dir /b *.txt | SET /P Var=чтобы получить правильное направление трубы. PS: это тоже не работает!
Джесси Чизхольм
-19

Надеюсь это поможет

set a=%username%
echo %a%    
set a="hello"
echo %a%
Ben2014
источник
5
Нет, это не отвечает на вопрос. Вопрос собирается получить выходные данные команды в переменную
jeb
Самый простой способ - записать файл и прочитать его из этого файла. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014