Можно ли установить вывод оператора пакетного файла в переменную, например:
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
конструкции перезаписывает ее. Кстати, невероятно, насколько безумно выглядящий код нужен для чего-то столь элементарного.
Я нашел эту тему на этой вещицкой паутине. Сводится к:
@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%