将命令的输出设置为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 ”包含命令的输出