将命令的输出设置为variables(带pipe道)
你能用pipe道把命令的输出redirect到一个variables吗?
我没有尝试过,因为我没有想到要尝试的任何东西,但我已经尝试了一种方法(有两个变化)…
例如:
echo Hello|set text=
没有工作,也没有工作:
echo Hello | set text=
我知道你可以用FOR
命令很容易地做到这一点,但是我认为用pipe子看起来会更好。
如果你想知道,我没有一个具体的原因,我问这个,而不是我好奇,我找不到答案。
你的方式不能工作有两个原因。
你需要使用set /p text=
来设置用户input的variables。
另一个问题是pipe道。
pipe道启动两个asynchronouscmd.exe实例,并在完成作业后closures两个实例。
这就是为什么似乎没有设置variables的原因,但是一个小例子表明它们已经设置,但是结果稍后会丢失。
set myVar=origin echo Hello | (set /p myVar= & set myVar) set myVar
输出
Hello origin
替代方法:您可以使用FOR循环来获取variables或临时文件的值。
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%
缺乏像Linux一样的反向/反引用function是PowerShell之前的一个主要烦恼。 通过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!
所以在你的情况下,你可以input:
> setvar text echo Hello text=Hello
脚本通知您结果,这意味着您可以:
> echo text var is now %text% text var is now Hello
你可以使用任何命令:
> setvar text FIND "Jones" names.txt
如果你想要pipe道到某个variables的命令包含一个pipe道?
三重逃脱, ^^^|
:
> setvar text dir c:\ ^^^| find "Win"
在一个batch file中,我通常在临时目录中创build一个文件并附加程序的输出,然后用一个variables名称来调用它来设置该variables。 喜欢这个:
:: 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%
这不使用PIPE,但需要一个临时文件
我使用这个将简化的时间戳放到一个低技术的日常维护batfile中
我们已经将我们的系统时间格式化为HHmm(10:45 PM为2245)
我使用$ DATE%@%TIME%时间戳将Maint-Routines的输出指向日志文件;
。 。 。 但是%TIME%是一个很长的string(例如224513.56,小到百分之一秒)
解决scheme概述:
1.使用redirect(“>”)每次发送命令“TIME / T”到OVERWRITE%TEMP%DIRECTORY中的临时文件
2.然后使用该tempfile作为input来设置一个新的variables(我现在称之为)
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%
后果:
所有剩下的事情是附加的日志文件,并不断覆盖tempfile。 如果临时文件被删除,它将根据需要重新创build。
您可以将输出设置为临时文件,然后从文件中读取数据,然后可以删除临时文件。
echo %date%>temp.txt set /p myVarDate= < temp.txt echo Date is %myVarDate% del temp.txt
在这个variables中,“ myVarDate ”包含命令的输出