你能使用管道将命令的输出重定向到变量中吗?
我尝试的并不多,因为我还没有想到要尝试什么,但我尝试了一种方法(有两种变化)...
例如:
echo Hello|set text=
没有起作用,以下也一样:
echo Hello | set text=
我知道你可以使用FOR
命令很容易做到,但我认为使用管道看起来更“漂亮”。
如果你想知道的话,我提出这个问题并没有具体的原因,只是出于好奇,而且我找不到答案。
你能使用管道将命令的输出重定向到变量中吗?
我尝试的并不多,因为我还没有想到要尝试什么,但我尝试了一种方法(有两种变化)...
例如:
echo Hello|set text=
没有起作用,以下也一样:
echo Hello | set text=
我知道你可以使用FOR
命令很容易做到,但我认为使用管道看起来更“漂亮”。
如果你想知道的话,我提出这个问题并没有具体的原因,只是出于好奇,而且我找不到答案。
你的方法行不通,原因有两个。
首先,你需要使用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批处理文件将程序输出分配给变量
for %%a in (a b c) do (echo %%a <NewLine>echo ----)
- jebfor /f %%i in ('first command ^&^& second command') do echo result: %%i
- end-usersetvar myvar cmd-line
命令。
在我的%path%
中,我有一个包含多个二进制文件和批处理文件以解决Windows的缺陷的目录。
我编写的一个批处理是:
:: 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
> echo text var is now %text%
text var is now Hello
你可以使用任何命令:
> setvar text FIND "Jones" names.txt
^^^|
:> setvar text dir c:\ ^^^| find "Win"
usebackq delims=
部分是做什么用的? - Richard Le Mesurierusebackq
指定使用类似 Linux 的语义,其中反引号字符串被执行为命令,并将输出解析到 for
变量中(这里是 %%a
)。delims=x
指定要在解析中使用的分隔符(这里没有分隔符)。 - antonio我对互联网上缺乏我认为的最佳答案感到有点惊讶。多年来,我一直在努力寻找答案。虽然许多在线答案都接近于正确,但没有一个真正回答了这个问题。真正的答案是:
(cmd & echo.) >2 & (set /p =)<2
"秘密酱"在于"echo."发送CR/LF(ENTER/new line/0x0D0A),这是"紧密保护的珍贵秘密"。否则,在这里我正在将第一个命令的输出重定向到标准错误流。然后将标准错误流重定向到"set /p ="命令的标准输入流。
例如:
(echo foo & echo.) >2 & (set /p bar=)<2
(cmd & echo.) >temp & (set /p =)<temp & del temp
。 - MatrixRonny你可以将输出设置为临时文件,然后从文件中读取数据,之后可以删除临时文件。
echo %date%>temp.txt
set /p myVarDate= < temp.txt
echo Date is %myVarDate%
del temp.txt
myVarDate
包含指令的输出结果。这不使用管道,但需要一个单一的临时文件。
我用它来将简化的时间戳放入一个低技术的每日维护批处理文件中。
我们已经将系统时间格式化为HHmm(10:45 PM为2245)
我将维护例程的输出定向到带有$DATE%@%TIME%时间戳的日志文件中;
...但%TIME%是一个很长的丑陋字符串(例如,down to the hundredths of a sec为224513.56)
解决方案概述:
1. 使用重定向(">")将命令"TIME /T"每次发送到%TEMP%目录中的一个临时文件中进行覆盖
2. 然后将该临时文件用作设置新变量的输入(我称之为NOW)
3. 将
echo $DATE%@%TIME% blah-blah-blah >> %logfile%替换为
echo $DATE%@%NOW% blah-blah-blah >> %logfile%
SUCCESSFUL TIMESYNCH 29Dec14@222552.30之后:
SUCCESSFUL TIMESYNCH 29Dec14@2252
实际代码:
TIME /T > %TEMP%\DailyTemp.txt SET /p NOW=<%TEMP%\DailyTemp.txt echo $DATE%@%NOW% blah-blah-blah >> %logfile%
后续影响:
之后只会剩下添加的日志文件和不断被覆盖的临时文件。如果临时文件被删除,它将根据需要重新创建。
git log --pretty=format:%ad_commit_%h -n 1 --date=short
。 - Kenn Sebesta:: 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%