Подтвердить что ты не робот

Задайте вывод команды как переменной (с помощью труб)

Можете ли вы перенаправить вывод команды на переменную с помощью труб?

Я не пробовал много, так как я не мог придумать ничего, чтобы попробовать, но я пробовал один метод (с двумя вариантами)...

Например:

echo Hello|set text=

Не работает, также:

echo Hello | set text=

Я знаю, что вы можете сделать это довольно легко с помощью команды FOR, но я думаю, что она будет выглядеть "лучше" с помощью канала.

И если вам интересно, у меня нет конкретной причины, я спрашиваю об этом, кроме того, что мне интересно, и я не могу найти ответ.

4b9b3361

Ответ 1

Ваш путь не может работать по двум причинам.

Вам нужно использовать set/p text= для установки переменной с помощью пользовательского ввода.
Другая проблема - труба.
Канал запускает два асинхронных экземпляра cmd.exe, и после завершения задания оба экземпляра закрываются.

Это причина, почему кажется, что переменные не установлены, но небольшой пример показывает, что они установлены, но результат теряется позже.

set myVar=origin
echo Hello | (set /p myVar= & set myVar)
set myVar

Выходы

Hello
origin

Альтернативы: Вы можете использовать цикл FOR для получения значений в переменные или временные файлы.

for /f "delims=" %%A in ('echo hello') do set "var=%%A"
echo %var%

или же

>output.tmp echo Hello
>>output.tmp echo world

<output.tmp (
  set /p line1=
  set /p line2=
)
echo %line1%
echo %line2%

Альтернатива с макросом:

Вы можете использовать пакетный макрос, это немного похоже на bash-эквивалент

@echo off

REM *** Get version string 
%$set% versionString="ver"
echo The version is %versionString[0]%

REM *** Get all drive letters
'%$set% driveLetters="wmic logicaldisk get name /value | findstr "Name""
call :ShowVariable driveLetters

Определение макроса можно найти на
SO: назначить вывод программы переменной с помощью командного файла MS

Ответ 2

Отсутствие Linux-подобной функции backtick/backquote является серьезным раздражением мира pre-PowerShell. Использование backquotes через for-loops совсем не уютно. Поэтому нам нужна команда setvar myvar cmd-line.

В моем %path% у меня есть каталог с несколькими ячейками и партиями, чтобы справиться с этими недостатками Win.

Одна партия, которую я написал, это:

:: setvar varname cmd
:: Set VARNAME to the output of CMD
:: Triple escape pipes, eg:
:: setvar x  dir c:\ ^^^| sort 
:: -----------------------------

@echo off
SETLOCAL

:: Get command from argument 
for /F "tokens=1,*" %%a in ("%*") do set cmd=%%b

:: Get output and set var
for /F "usebackq delims=" %%a in (`%cmd%`) do (
     ENDLOCAL
     set %1=%%a
)

:: Show results 
SETLOCAL EnableDelayedExpansion
echo %1=!%1! 

Итак, в вашем случае вы должны ввести:

> setvar text echo Hello
text=Hello 

script информирует вас о результатах, что означает, что вы можете:

> echo text var is now %text%
text var is now Hello 

Вы можете использовать любую команду:

> setvar text FIND "Jones" names.txt

Что делать, если команда, которую вы хотите подключить к какой-либо переменной, содержит сам канал? Тройка уберет его, ^^^|:

> setvar text dir c:\ ^^^| find "Win"

Ответ 3

ЭТО НЕ ИСПОЛЬЗУЕТ ТРУБЫ, но требует одного временного файла
Я использовал это, чтобы установить упрощенные временные метки в ежедневный файл batte для lowtech

Мы уже коротко отформатировали наше системное время до HHmm (что составляет 2245 за 10:45 вечера)
Я направляю вывод Maint-Routines на лог файлы с временной меткой $DATE% @% TIME%.
,, но% TIME% - длинная уродливая строка (например, 224513,56, с точностью до сотых долей секунды)

ОБЗОР РЕШЕНИЯ:
1. Используйте перенаправление ( " > " ) для отправки команды "ВРЕМЯ/Т" каждый раз, чтобы НАПРАВИТЬ временный файл в% TEMP% DIRECTORY
2. Затем используйте этот tempfile как вход для установки новой переменной (я назвал ее СЕЙЧАС)
3. Заменить

 echo $DATE% @% TIME% blah-blah-blah >>% logfile%
    с
echo $DATE%@%NOW% blah-blah-blah >> %logfile%


==== РАЗЛИЧИЕ В ВЫХОДЕ:
ПЕРЕД:
SUCCESSFUL TIMESYNCH [email protected]
ПОСЛЕ:
 УСПЕШНОЕ ВРЕМЕННОЕ ВРЕМЯ 29Dec14 @2252


АКТУАЛЬНЫЙ КОД:

 TIME/T>% TEMP%\DailyTemp.txt
SET/p NOW = <% TEMP%\DailyTemp.txt
echo $DATE% @% СЕЙЧАС% blah-blah-blah >>% logfile%


ПОСЛЕДСТВИЯ:
Все, что осталось после этого, - это добавленный файл журнала и постоянно перезаписываемый tempfile. И если Tempfile когда-либо удаляется, он будет воссоздан по мере необходимости.

Ответ 4

В пакетном файле я обычно создаю файл в каталоге temp и добавьте вывод из программы, затем я вызываю его с переменной именем, чтобы установить эту переменную. Вот так:

:: Create a set_var.cmd file containing: set %1=
set /p="set %%1="<nul>"%temp%\set_var.cmd"

:: Append output from a command
ipconfig | find "IPv4" >> "%temp%\set_var.cmd"
call "%temp%\set_var.cmd" IPAddress
echo %IPAddress%

Ответ 5

Вы можете установить вывод во временный файл и прочитать данные из файла, после чего вы можете удалить временный файл.

echo %date%>temp.txt
set /p myVarDate= < temp.txt
echo Date is %myVarDate%
del temp.txt

В этой переменной " myVarDate" содержится вывод команды