如何在Windows中的variables中获得命令的结果?

我正在寻找一个命令的结果作为一个Windows批处理脚本中的variables(请参阅如何获得在bash脚本命令等效的命令的结果 )。 在.bat文件中工作的解决scheme是首选,但也欢迎其他常见的Windows脚本解决scheme。

如果你必须捕获所有的命令输出,你可以像这样使用批处理:

@ECHO OFF IF NOT "%1"=="" GOTO ADDV SET VAR= FOR /F %%I IN ('DIR *.TXT /B /O:D') DO CALL %0 %%I SET VAR GOTO END :ADDV SET VAR=%VAR%!%1 :END 

所有输出行均以VAR格式存储,并以“!”分隔。

@约翰:这有什么实际用途吗? 我想你应该看PowerShell或任何其他编程语言能够轻松执行脚本任务(Python,Perl,PHP,Ruby)

卑微指挥已经积累了一些有趣的能力多年来:

 D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i D:\> echo %today% Sat 20/09/2008 

请注意, "delims="覆盖默认空格和制表符分隔符,以便date命令的输出一次全部获取。

为了捕获多行输出,它可以基本上是单行的(在结果variables中使用variableslf作为分隔符):

 REM NB:in a batch file, need to use %%i not %i setlocal EnableDelayedExpansion SET lf=- FOR /F "delims=" %%i IN ('dir \ /b') DO if ("!out!"=="") (set out=%%i) else (set out=!out!%lf%%%i) ECHO %out% 

要捕捉pipe道expression式,请使用^|

 FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i" 

要获取当前目录,可以使用这个:

 CD > tmpFile SET /p myvar= < tmpFile DEL tmpFile echo test: %myvar% 

它使用临时文件,所以它不是最漂亮的,但它当然有效! 'CD'把当前目录放在'tmpFile'中,'SET'加载tmpFile的内容。

这是一个解决scheme多行“arrays”:

 @echo off rem --------- rem Obtain line numbers from the file rem --------- rem This is the file that is being read: You can replace this with %1 for dynamic behaviour or replace it with some command like the first example i gave with the 'CD' command. set _readfile=test.txt for /f "usebackq tokens=2 delims=:" %%a in (`find /c /v "" %_readfile%`) do set _max=%%a set /a _max+=1 set _i=0 set _filename=temp.dat rem --------- rem Make the list rem --------- :makeList find /n /v "" %_readfile% >%_filename% rem --------- rem Read the list rem --------- :readList if %_i%==%_max% goto printList rem --------- rem Read the lines into the array rem --------- for /f "usebackq delims=] tokens=2" %%a in (`findstr /r "\[%_i%]" %_filename%`) do set _data%_i%=%%a set /a _i+=1 goto readList :printList del %_filename% set _i=1 :printMore if %_i%==%_max% goto finished set _data%_i% set /a _i+=1 goto printMore :finished 

但是你可能想考虑转移到另一个更强大的shell或者为这个东西创build一个应用程序。 它扩展了batch file的可能性。

您需要使用带有参数/PSET命令并将输出指向它。 例如,请参阅http://www.ss64.com/nt/set.html 。 将为CMD工作,不知道.BAT文件

从评论到这个职位:

该链接的命令是“ Set /P _MyVar=<MyFilename.txt ”,表示将_MyVar设置为_MyVar的第一行。 这可以用“ myCmd > tmp.txt ”和“ set /P myVar=<tmp.txt ”来使用。 但它只会得到输出的第一行,而不是所有的输出

在“V”环境variables中设置最新文件的示例

 FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I 

在batch file中,你必须在循环variables中使用双前缀:

 FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I 

如果您正在寻找使用命令的结果作为bash中的参数提供的解决scheme?

那么这里是代码:

 @echo off if not "%1"=="" goto get_basename_pwd for /f "delims=X" %%i in ('cd') do call %0 %%i for /f "delims=X" %%i in ('dir /o:d /b') do echo %%i>>%filename%.txt goto end :get_basename_pwd set filename=%~n1 :end 
  • 这将使用CD命令的结果自动调用,与pwd相同。
  • 参数上的string提取将返回文件名/文件夹。
  • 获取此文件夹的内容并追加到filename.txt

[积分] :感谢所有其他答案,并在Windows XP命令页面上进行了一些挖掘。

 @echo off ver | find "6.1." > nul if %ERRORLEVEL% == 0 ( echo Win7 for /f "delims=" %%a in ('DIR "C:\Program Files\Microsoft Office\*Outlook.EXE" /B /P /S') do call set findoutlook=%%a %findoutlook% ) ver | find "5.1." > nul if %ERRORLEVEL% == 0 ( echo WinXP for /f "delims=" %%a in ('DIR "C:\Program Files\Microsoft Office\*Outlook.EXE" /B /P /S') do call set findoutlook=%%a %findoutlook% ) echo Outlook dir: %findoutlook% "%findoutlook%" 

只需使用FOR命令的结果。 例如(在batch file中):

 for /F "delims=" %%I in ('dir /b /ad /od FILESA*') do (echo %%I) 

你可以使用%%I作为你想要的值。 就像这样: %%I

并提前%%I没有任何空格或CR字符,可用于比较!

您可以捕获一个variables中的所有输出,但这些行将由您select的字符(下例中的#)分隔,而不是实际的CR-LF。

 @echo off setlocal EnableDelayedExpansion for /f "delims=" %%i in ('dir /b') do ( if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i) ) echo directory contains: echo %DIR% 

第二个版本,如果你需要逐行打印的内容。 这有利于不会有来自“dir / b”的输出的重复行,因此在一般情况下可能不起作用。

 @echo off setlocal EnableDelayedExpansion set count=0 for /f "delims=" %%i in ('dir /b') do ( if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i) set /a count = !count! + 1 ) echo directory contains: echo %DIR% for /l %%c in (1,1,%count%) do ( for /f "delims=#" %%i in ("!DIR!") do ( echo %%i set DIR=!DIR:%%i=! ) ) 

请参阅http://technet.microsoft.com/en-us/library/bb490982.aspx ,它解释了您可以使用命令输出进行的操作。