![]()
Я вот еще как то долго мучался с тем,как получать в значение переменной текст из файла например.
Или результат работы команды в переменную.
Можно тоже этот вопрос задеть?
set /p content=< file.txt
![]()
результат работы команды в переменную.
:: включаем поддержку дополнительных ключей
SetLocal EnableExtensions
For /F %%s in ('tasklist') do set var=%%s
echo %var%
pause В данном случае в переменную сохранится последняя строка вывода команды tasklist.
Пример от Ramzes
, пригодится, если из текстового файла нужно прочитать 1-ю строку.
--Product=Skif_BP
--Patch_Header=Skif_BP
--Patch_Version=4.0.0.608 (25.02.2015) Нужно получить в переменную значение Patch_Version
, до даты выпуска патча, т.е. в данном случае 4.0.0.608
.
Подскажите, как это реализовать на cmd (можно с использованием сторонних консольных утилит).
![]()
Здравствуйте, maximax
!
Воспользуйтесь таким скриптом.
@echo off
SetLocal EnableExtensions
set file=SQL.txt
For /F "UseBackQ tokens=1-2 delims==( " %%a in ("%file%") do if "%%a"=="--Patch_Version" set ver=%%b
echo Version=%ver%
pause Файл должен быть в кодировке ANSI (не юникод).
Последнее редактирование: 12 Мар 2015
Здравствуйте, maximax
!Воспользуйтесь таким скриптом.
@echo off SetLocal EnableExtensions set file=SQL.txt For /F "UseBackQ tokens=1-2 delims==( " %%a in ("%file%") do if "%%a"=="--Patch_Version" set ver=%%b echo Version=%ver% pauseФайл должен быть в кодировке ANSI (не юникод).
Большое спасибо, всё работает. Сам на питоне написал, а как на cmd реализовать не смог сообразить, теперь понятно.
Последнее редактирование: 12 Мар 2015
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 Я нашел этот поток
о том, что там Interweb вещь. Откидывается до:
@echo off
setlocal enableextensions
for /f "tokens=*" %%a in (
'VER'
) do (
set myvar=%%a
)
echo/%%myvar%%=%myvar%
pause
endlocal Вы также можете перенаправить вывод команды во временный файл, а затем поместить содержимое этого временного файла в свою переменную, preferuchashereby:
cmd > tmpFile
set /p myvar= < tmpFile
del tmpFile Кредит на тему Tom Hardware.
в одной строке:
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 В любом случае пара полезных вещей
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 Путем подачи команды в приглашение переменной будет вставляться результат команды “Cmd” в переменную “Var”.
Это не работает, мой плохой, script я сделал это:
SET /P Var= | dir /b *.txt
echo %Var% Надеемся на эту помощь
set a=%username%
echo %a%
set a="hello"
echo %a% Ещё вопросы
Переменные. Команда SET
Ввод с клавиатуры
set /p x="BBeduTe cTpoky: " Ограничение 8184 символа.
Тип число
Ограничение от -2147483647 до 2147483647.
Вывод значения переменных
%RANDOM%
– раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
set /a random10=%random%/3277 Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD%
– раскрывается в строку текущей директории.
%DATE%
– раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME%
– раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL%
– раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 – это нет ошибки, 1 – это есть ошибка, а другие это номера ошибки.
Чтобы получить полный список переменных и их значений введите команду SET
Операции со строковыми или численными переменными
Соединение 2-ух строковых переменных
set x=Gaz
set y=Prom
echo %x%%y%
(GazProm) Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
Вывод 1-ого символа
Вывод 3-х символов с конца строки
Вывод всей строки кроме 2-ух первых символов
Вывод всей строки кроме 2-ух последних символов
Вывод 3-х символов начиная с 3
Удаление подстроки из строки
set str=babywka
echo %str:ba=%
(bywka) Замена подстроки из строки на другую подстроку
set str=babywka
echo %str:bab=xlop%
(xlopywka) Удаление кавычек(“) из строки
set str2="qwerty"
echo %str2:"=%
(qwert) В данном случае: если кавычки в начале и конце строки – можно юзать
echo %str2:~1,-1%
(qwert) Существуют 2 способа использовать переменную в переменной, например:
вывод n-ого символа
Первый способ с call set
call set x=%%str:~%n%,1%%
echo %x% Второй способ с for
и setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x% тут неважно что в for
писать, главное
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i
юзаем %%i.
Операции с числовыми переменными
Увеличивание на единицу
Увеличивание в 2 раза
Возведение в квадрат
Возведение в куб
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
set /a x=15
set /a y=4
set /a xy=%x%/%y%
set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1) set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11) Вычисление остатка от деления
(при записи в батник, процент “%” нужно удваивать “%%”)
Логическое отрицание (Logical NOT)
дает результат (%y%)
1 (True)
, если переменная (%x%)
равна 0 (False)
, и 0 (False)
(%y%)
в любых других случаях
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x% Побитовая инверсия (Bitwise NOT):
дает результат -1-%x%
(%y%)
Например
set /a x=5
set /a y="~"%x%
(-1-5=-(1+5)= -6)
set /a x=-3
set /a y="~"%x%
(-1-(-3)=-1+3=3-1= 2) Унарный минус
(устанавливает/сбрасывает знаковый бит)
дает результат 0-%x%
(%y%)
Например
set /a x=5
set /a y="-"%x%
(-5)
set /a x=-3
set /a y="-"%x%
set x=3
(в двоичной системе счисления - 0011)
set y=5
(в двоичной системе счисления - 0101) Побитовое И (AND)
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
set /a xy=%x%"&"%y%
(1, в двоичной системе счисления - 0001) Побитовое ИЛИ (OR)
Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.
set /a xy=%x%"|"%y%
(7, в двоичной системе счисления - 0111) Побитовое исключающее ИЛИ (XOR)
Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на
одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.
set /a xy=%x%"^"%y%
(6, в двоичной системе счисления - 0110) К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.
Двоичный арифметический сдвиг
Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.
set /a xy=%x%">>"1
(1, в двоичной системе счисления - 0011->0001)
set /a xy2=%y%">>"1
(2, в двоичной системе счисления - 0101->0010)
set /a n=13
(в двоичной системе счисления - 1101)
set /a xn=%n%">>"2
(3, в двоичной системе счисления - 1101->0011)
set /a my=-%y%">>"1
(-3, в двоичной системе счисления - 1011(-5)->1101(-3)) set /a xy=%x%"<<"1
(6, в двоичной системе счисления - 0011->0110)
set /a xy2=%y%"<<"1
(10, в двоичной системе счисления - 0101->1010)
set /a xy3=%y%"<<"4
(80, в двоичной системе счисления - 0101->1010000)
set /a my=-%y%"<<"1
(-10, в двоичной системе счисления - 1011(-5)->10110(-10)) И я забыл, про 8-ричную и 16-ричную систему счисления в CMD
Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.
Восьмеричная система счисления
set /a x=022
(Это 22 в восьмеричной системе счисления, и 18 в десятичной) Можно производить все операции, также как и с десятеричными числами.
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
set /a xy=022+07
(Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной) Шестнадцатеричная система счисления
set /a x=0x3A
(Это 3A в восьмеричной системе счисления, и 58 в десятичной) set /a xy=0x3A-0x66
(Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной) Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
echo 1|set /p AA=""
set AA Поэтому можно воспользоваться временным сохранением в файл:
echo 1> 0.tmp
set /p AA="" <0.tmp
del 0.tmp
echo %AA% Примеры использования
Узнать динамически генерируемое имя архива WinRar:
rar a -z%Comment% -p%p% "-ag yyyy-mm-dd[n]" %OutPath%\%arhivename%.%ext% @%FileList% >rar.log.tmp
for /f "tokens=2*" %%I in ('find /i "Creating archive" ^<rar.log.tmp') do @echo %%J >rarfilename.tmp
set /p rarfilename="" <rarfilename.tmp
del rarfilename.tmp Узнать имя последнего изменённого файла в папке:
dir /b /a-d /o-d *.* >%temp%\0.tmp
set /p lastfile="" <%temp%\0.tmp
del %temp%\0.tmp
echo "%lastfile%" set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%" Оператор ==
используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы <
и >
являются указателями перенаправления ввода-вывода.
Я хочу получить результат команды в виде переменной в пакетном скрипте Windows (см. как получить результат выполнения команды в bash
для эквивалента сценария bash). Решение, которое будет работать с файлом .bat, является предпочтительным, но также приветствуются другие распространенные решения сценариев Windows.
person
schedule
source
источник
Ответы
Если вам нужно захватить весь вывод команды, вы можете использовать такой пакет:
@ECHO OFF
IF NOT "%1"=="" GOTO ADDV
SET VAR=
FOR /F %%I IN ('DIR *.TXT /B /O:D') DO CALL %0 %%I
SET VAR
GOTO END
:ADDV
SET VAR=%VAR%!%1
:END Все выходные строки сохраняются в VAR, разделенные знаком “!”.
person
schedule
Скромная команда for
за годы накопила несколько интересных возможностей:
D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i
D:\> echo %today%
Sat 20/09/2008 Обратите внимание, что "delims="
перезаписывает разделители пробелов и табуляции по умолчанию, так что вывод команды date сразу же проглатывается.
Для захвата многострочного вывода он по-прежнему может быть однострочным (с использованием переменной lf в качестве разделителя в результирующей переменной):
REM NB:in a batch file, need to use %%i not %i
setlocal EnableDelayedExpansion
SET lf=-
FOR /F "delims=" %%i IN ('dir \ /b') DO if ("!out!"=="") (set out=%%i) else (set out=!out!%lf%%%i)
ECHO %out% FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i" person
schedule
Чтобы получить текущий каталог, вы можете использовать это:
CD > tmpFile
SET /p myvar= < tmpFile
DEL tmpFile
echo test: %myvar% Хотя он использует временный файл, поэтому он не самый красивый, но, безусловно, работает! «CD» помещает текущий каталог в «tmpFile», «SET» загружает содержимое tmpFile.
Вот решение для нескольких строк с «массивом»:
@echo off
rem ---------
rem Obtain line numbers from the file
rem ---------
rem This is the file that is being read: You can replace this with %1 for dynamic behaviour or replace it with some command like the first example i gave with the 'CD' command.
set _readfile=test.txt
for /f "usebackq tokens=2 delims=:" %%a in (`find /c /v "" %_readfile%`) do set _max=%%a
set /a _max+=1
set _i=0
set _filename=temp.dat
rem ---------
rem Make the list
rem ---------
:makeList
find /n /v "" %_readfile% >%_filename%
rem ---------
rem Read the list
rem ---------
:readList
if %_i%==%_max% goto printList
rem ---------
rem Read the lines into the array
rem ---------
for /f "usebackq delims=] tokens=2" %%a in (`findstr /r "\[%_i%]" %_filename%`) do set _data%_i%=%%a
set /a _i+=1
goto readList
:printList
del %_filename%
set _i=1
:printMore
if %_i%==%_max% goto finished
set _data%_i%
set /a _i+=1
goto printMore
:finished Но вы можете подумать о переходе на другую, более мощную оболочку или создать приложение для этого. Это немного расширяет возможности командных файлов.
person
schedule
вам нужно использовать команду SET
с параметром /P
и направить на нее свой вывод. Например, см. http://www.ss64.com/nt/set.html
. Будет работать для CMD, не уверен в файлах . BAT
Из комментария к этому сообщению:
В этой ссылке есть команда ”
Set /P
_MyVar=<MyFilename.txt
“, которая говорит, что она установит_MyVar
на первую строку изMyFilename.txt
. Может использоваться как «myCmd > tmp.txt
» с «set
/P myVar=<tmp.txt
». Но он получит только первую строку вывода, а не весь вывод.
person
schedule
Пример установки в переменной среды “V” самого последнего файла
FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I в пакетном файле вы должны использовать двойной префикс в переменной цикла:
FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I person
schedule
К вышеперечисленным решениям хочу добавить замечание:
Все эти синтаксисы отлично работают, ЕСЛИ ВАША КОМАНДА НАЙДЕНА В ПУТИ или ЕСЛИ КОМАНДА ЯВЛЯЕТСЯ cmdpath БЕЗ ПРОБЕЛОВ ИЛИ СПЕЦИАЛЬНЫХ СИМВОЛОВ.
Но если вы попытаетесь использовать исполняемую команду, расположенную в папке, путь которой содержит специальные символы, вам нужно будет заключить путь к вашей команде в двойные кавычки (“), и тогда синтаксис FOR / F не будет работать.
$ for /f "tokens=* USEBACKQ" %f in ( `""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" Hello '"F:\GLW7\Distrib\System\Shells and scripting"'`
) do echo %f
The filename, directory name, or volume label syntax is incorrect. $ for /f "tokens=* USEBACKQ" %f in ( `"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'F:\GLW7\Distrib\System\Shells' is not recognized as an internal or external command, operable program or batch file. `$ for /f "tokens=* USEBACKQ" %f in ( `""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello' is not recognized as an internal or external command, operable program or batch file. В этом случае единственное решение, которое я нашел для использования команды и сохранения ее результата в переменной, – это установить (временно) каталог по умолчанию на каталог самой команды:
pushd "%~d0%~p0"
FOR /F "tokens=* USEBACKQ" %%F IN ( `FOLDERBROWSE "Hello world!" "F:\GLW7\Distrib\System\Layouts (print,display...)"`
) DO (SET MyFolder=%%F)
popd
echo My selected folder: %MyFolder% Тогда результат правильный:
My selected folder: F:\GLW7\Distrib\System\OS install, recovery, VM\
Press any key to continue . . . Конечно, в приведенном выше примере я предполагаю, что мой пакетный сценарий находится в той же папке, что и одна из моих исполняемых команд, поэтому я могу использовать синтаксис «% ~ d0% ~ p0». Если это не ваш случай, вам нужно найти способ найти путь к вашей команде и изменить каталог по умолчанию на его путь.
NB: Для тех, кому интересно, здесь используется образец команды (для выбора папки) – FOLDERBROWSE. EXE. Я нашел его на веб-сайте f2ko.de ( http://f2ko.de/en/cmd.php
).
Если у кого-то есть лучшее решение для таких команд, доступных через сложный путь, я буду очень рад услышать об этом.
person
schedule
Просто используйте результат команды FOR
. Например (внутри командного файла):
for /F "delims=" %%I in ('dir /b /a-d /od FILESA*') do (echo %%I) Вы можете использовать %%I
как желаемое значение. Вот так: %%I
.
И заранее %%I
не имеет пробелов или символов CR и может использоваться для сравнения !!
person
schedule
Если вы ищете решение, представленное в Используете результат команды в качестве аргумента в bash?
тогда вот код:
@echo off
if not "%1"=="" goto get_basename_pwd
for /f "delims=X" %%i in ('cd') do call %0 %%i
for /f "delims=X" %%i in ('dir /o:d /b') do echo %%i>>%filename%.txt
goto end
:get_basename_pwd
set filename=%~n1
:end - Это вызовет себя с результатом команды CD, так же, как pwd.
- При извлечении строки по параметрам будет возвращено имя файла / папка.
- Получите содержимое этой папки и добавьте в filename.txt
person
schedule
Вы можете записать весь вывод в одной переменной, но строки будут разделены символом по вашему выбору (# в примере ниже) вместо фактического CR-LF.
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /b') do ( if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i)
)
echo directory contains:
echo %DIR% Вторая версия, если вам нужно распечатать содержимое построчно. При этом учитывается тот факт, что не будет повторяющихся строк вывода из “dir / b”, поэтому в общем случае это может не работать.
@echo off
setlocal EnableDelayedExpansion
set count=0
for /f "delims=" %%i in ('dir /b') do ( if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i) set /a count = !count! + 1
)
echo directory contains:
echo %DIR%
for /l %%c in (1,1,%count%) do ( for /f "delims=#" %%i in ("!DIR!") do ( echo %%i set DIR=!DIR:%%i=! )
) person
schedule
@echo off
setlocal EnableDelayedExpansion
FOR /F "tokens=1 delims= " %%i IN ('echo hola') DO ( set TXT=%%i
)
echo 'TXT: %TXT%' результат – “TXT: hola”
person
schedule
Вы должны использовать команду for
, вот пример:
@echo off
rem Commands go here
exit /b
:output
for /f "tokens=* useback" %%a in (`%~1`) do set "output=%%a" и вы можете использовать call :output "Command goes here"
, тогда результат будет в переменной %output%
.
Примечание.
Если у вас есть многострочный вывод команды, этот инструмент будет set
выводить в последнюю строку многострочной команды.
person
schedule



