Як встановити команди виведення у вигляді змінної у пакетному файлі


242

Чи можна встановити вихід оператора пакетного файлу на змінну, наприклад:

findstr testing > %VARIABLE%

echo %VARIABLE%




ще один дублікат просто для розваги:
Пакет

Відповіді:


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

3
Працював для мене в системі Win7, дякую! (і так, це 7 років корисності) PS Не забудьте розширити% до %% в командах!
Дмитро Ілухін

Це чудово спрацьовує ... якщо тільки вихід не містить знаків оклику (!), Оскільки вони будуть інтерпретовані як контрольні символи при використанніENABLEDELAYEDEXPANSION
JonathanDavidArndt

Це працює добре, за винятком випадків, коли вам потрібно скористатися, і |в цьому випадку це не працює.
Метт Вукоманович

6
@MattVukomanovic працює для мене, використовуючи ^|замість |, як описано тут,
AST

Чи можливо захопити вихідний код commandбудь-яким чином, будь ласка? Я впевнений, що він повертає ненульовий код, але %ERRORLEVEL%завжди містить 0, незалежно від того, де я намагаюся його використовувати (навіть усередині doблоку). Тож я здогадуюсь, що частина цієї forконструкції перезаписує її. BTW Неймовірно, наскільки шалено виглядає код для чогось такого елементарного.
Девід Ференці Рогожан

69

Я знайшов цю нитку на тій річці Interweb. Зводиться до:

@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 

Заслуга нитки на апаратному забезпеченні Тома.


3
Єдиним недоліком підходу до низу (який є кращим у всіх інших способах) є те, що він не працює з багаторядковим висновком.
dgo

Для VER я б пішов іншим шляхом: для / f "tokens = 2 delims = [,]" %% a in ('ver') встановити версію %% a echo% version%
Hardoman

1
ви другий результат для Likeuchashereby - imagebin.ca/v/4NPSlQFgifce
Шмуель Каменський

Ваш другий приклад мені дуже допоміг написати пакетний файл, щоб перевірити версію chromedriver.exe порівняно з текстовим файлом, що містить номер версії. Я старий динозавр DOS, і не знав про перемикання на встановлену команду. Інші речі були для мене надмірними.
Білл Хілеман

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
+ Сантьяго Віллафуерте: так, якщо ви працюєте з пакетного файлу, але якщо ви хочете запустити його з командного рядка самостійно (наприклад: протестувати його перед тим, як помістити його в пакетний файл), тоді ви використовуєте один%.
Brent Rittenhouse

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 

і так далі

Все одно пара корисних речей


Спасибі за вашу відповідь. BTW "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.


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це не стандартна програма, і я не бачу, куди ви призначаєте вихідну програму змінній. Нарешті вам потрібні ще кілька пояснень
1717

-3

Я перевірив це так і це спрацювало:

SET /P Var= | Cmd

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

Оновлення:

Це не працює, мій поганий, сценарій у мене був такий:

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

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


3
Якщо ви мали намір pipe the command into a variable promptтоді, ви повинні були написати це, dir /b *.txt | SET /P Var=щоб виправити напрямок своєї труби. PS: Це теж не працює!
Джессі Чісгольм

-18

Сподіваюся, що це допоможе

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
Ні, це не відповідає на питання. Питання про те, щоб вивести команду в змінну
jeb

Найпростіший спосіб - записати у файл та прочитати його з цього файлу. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.