Я хочу получить результат команды в виде переменной в пакетном сценарии Windows (см., Как получить результат команды в bash для эквивалента сценария bash). Решение, которое будет работать с файлом .bat, является предпочтительным, но также приветствуются другие распространенные решения сценариев Windows.
windows
scripting
batch-file
Джон Мигер
источник
источник
Ответы:
Если вам нужно захватить весь вывод команды, вы можете использовать такой пакет:
Все выходные строки сохраняются в VAR, разделенные знаком "!".
@John: есть ли в этом практическая польза? Я думаю, вам стоит посмотреть PowerShell или любой другой язык программирования, способный легко выполнять скриптовые задачи (Python, Perl, PHP, Ruby).
источник
cmd
чтобы я мог запустить его там. ... Да, это ужасно, как звучит. Visual Studio иногда заставляет меня плакать. @ Ajedi32 Я думаю, вы хотели сказать, что пакетные скрипты - это ужасный пережиток прошлого. ;)Скромный командир за годы накопил несколько интересных способностей:
Обратите внимание, что
"delims="
перезаписываются разделители пробелов и табуляции по умолчанию, так что вывод команды date сразу же проглатывается.Для захвата многострочного вывода он все еще может быть однострочным (с использованием переменной lf в качестве разделителя в результирующей переменной):
Чтобы записать конвейерное выражение, используйте
^|
:источник
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
команду прямо в командной строке, вы используете одиночный%
. Если вы используете его в пакетном файле, вы используете%%
.%
, например:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
используемая команда исходит от Cygwin. Я согласен, я должен был упомянуть об этом.Чтобы получить текущий каталог, вы можете использовать это:
Хотя он использует временный файл, поэтому он не самый красивый, но, безусловно, работает! «CD» помещает текущий каталог в «tmpFile», «SET» загружает содержимое tmpFile.
Вот решение для нескольких строк с "массивом":
Но вы можете подумать о переходе на другую, более мощную оболочку или создать приложение для этого. Это немного расширяет возможности командных файлов.
источник
вам нужно использовать
SET
команду с параметром/P
и направить на него свой вывод. Например, см. Http://www.ss64.com/nt/set.html . Будет работать для CMD, не уверен в файлах .BATИз комментария к этому сообщению:
источник
Пример установки в переменной среды "V" самого последнего файла
в пакетном файле вы должны использовать двойной префикс в переменной цикла:
источник
Просто используйте результат
FOR
команды. Например (внутри командного файла):Вы можете использовать в
%%I
качестве желаемого значения. Так же , как это:%%I
.И заранее
%%I
не имеет пробелов или символов CR и может использоваться для сравнения !!источник
Если вы ищете решение, представленное в разделе Использование результата команды в качестве аргумента в bash?
тогда вот код:
[Кредиты] : Спасибо всем остальным ответам и некоторым копаниям на странице команд Windows XP .
источник
источник
К приведенным выше решениям я хотел бы добавить замечание:
Все эти синтаксисы работают отлично, ЕСЛИ ВАША КОМАНДА НАЙДЕНА В ПУТИ или ЕСЛИ КОМАНДА ЯВЛЯЕТСЯ cmdpath БЕЗ ПРОБЕЛОВ ИЛИ СПЕЦИАЛЬНЫХ СИМВОЛОВ.
Но если вы попытаетесь использовать исполняемую команду, расположенную в папке, путь которой содержит специальные символы, вам нужно будет заключить путь к вашей команде в двойные кавычки ("), и тогда синтаксис FOR / F не будет работать.
Примеры:
или
или
В этом случае единственное решение, которое я нашел для использования команды и сохранения ее результата в переменной, - это установить (временно) каталог по умолчанию для самой команды:
Тогда результат правильный:
Конечно, в приведенном выше примере я предполагаю, что мой пакетный сценарий находится в той же папке, что и одна из моих исполняемых команд, так что я могу использовать синтаксис «% ~ d0% ~ p0». Если это не ваш случай, вам нужно найти способ найти путь к вашей команде и изменить каталог по умолчанию на его путь.
NB: Для тех, кому интересно, здесь используется пример команды (для выбора папки) FOLDERBROWSE.EXE. Я нашел его на сайте f2ko.de ( http://f2ko.de/en/cmd.php ).
Если у кого-то есть лучшее решение для таких команд, доступных через сложный путь, я буду очень рад услышать об этом.
жилль
источник
CALL
. FOR / F не работает, если в пути есть пробелыCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> отлично работает.Вы можете записать весь вывод в одну переменную, но строки будут разделены выбранным вами символом (# в примере ниже) вместо фактического CR-LF.
Вторая версия, если вам нужно распечатать содержимое построчно. При этом учитывается тот факт, что не будет повторяющихся строк вывода из "dir / b", поэтому в общем случае это может не работать.
источник
результат - "TXT: hola"
источник
Вам следует использовать
for
команду, вот пример:и вы можете использовать,
call :output "Command goes here"
тогда вывод будет в%output%
переменной.Примечание. Если у вас есть многострочный вывод команды, этот инструмент будет
set
выводить его в последнюю строку многострочной команды.источник
См. Http://technet.microsoft.com/en-us/library/bb490982.aspx, где объясняется, что вы можете делать с выводом команд.
источник
git pull>0 set /P RESULTVAR=<0
edit: Думаю, я не знаю, как использовать здесь разрывы строк ... каждая команда находится в отдельной строке.