Чи можна встановити вихід оператора пакетного файлу на змінну, наприклад:
findstr testing > %VARIABLE%
echo %VARIABLE%
Чи можна встановити вихід оператора пакетного файлу на змінну, наприклад:
findstr testing > %VARIABLE%
echo %VARIABLE%
Відповіді:
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
ENABLEDELAYEDEXPANSION
|
в цьому випадку це не працює.
command
будь-яким чином, будь ласка? Я впевнений, що він повертає ненульовий код, але %ERRORLEVEL%
завжди містить 0, незалежно від того, де я намагаюся його використовувати (навіть усередині do
блоку). Тож я здогадуюсь, що частина цієї for
конструкції перезаписує її. BTW Неймовірно, наскільки шалено виглядає код для чогось такого елементарного.
Я знайшов цю нитку на тій річці 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
Заслуга нитки на апаратному забезпеченні Тома.
в одному рядку:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
командний вихід буде встановлений у% g, а потім у VAR.
Більше інформації: https://ss64.com/nt/for_cmd.html
Щоб прочитати файл ...
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
і так далі
Все одно пара корисних речей
Усі ці відповіді були настільки близькими до тієї відповіді, яка мені була потрібна. Це спроба розширити їх.
Якщо ви працюєте з .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
рядок у параметри, щоб ви могли використовувати зворотні лапки, щоб вказати команду для запуску, а потім усі види смішних символів всередині неї.
Якщо ви не хочете виводити у тимчасовий файл, а потім читати в змінну, цей код зберігає результат команди безпосередньо у змінну:
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.
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
це не стандартна програма, і я не бачу, куди ви призначаєте вихідну програму змінній. Нарешті вам потрібні ще кілька пояснень
Я перевірив це так і це спрацювало:
SET /P Var= | Cmd
Переконуючи команду у змінну, підказка вставить результат команди " Cmd
" у змінну " Var
".
Оновлення:
Це не працює, мій поганий, сценарій у мене був такий:
SET /P Var= | dir /b *.txt
echo %Var%
Це насправді показувало скажімо " test.txt
", але насправді показувало результат команди " dir /b *.txt
", а не echo %var%
. Я заплутався, оскільки обидва виходи були однакові.
pipe the command into a variable prompt
тоді, ви повинні були написати це, dir /b *.txt | SET /P Var=
щоб виправити напрямок своєї труби. PS: Це теж не працює!
Сподіваюся, що це допоможе
set a=%username%
echo %a%
set a="hello"
echo %a%