我希望将命令的结果作为Windows批处理脚本中的变量(请参阅如何在bash中获取bash脚本等效命令的结果).可以在.bat文件中使用的解决方案是首选,但也欢迎其他常见的Windows脚本解决方案.
多年来,谦逊的命令积累了一些有趣的能力:
D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i D:\> echo %today% Sat 20/09/2008
请注意,"delims="
覆盖默认空格和制表符分隔符,以便date命令的输出一次全部吞噬.
要捕获多行输出,它仍然可以基本上是单行(使用变量lf作为结果变量中的分隔符):
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%
要捕获管道表达式,请使用^|
:
FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i"
如果必须捕获所有命令输出,则可以使用如下批处理:
@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中,以"!"分隔.
@John:这有什么实际用途吗?我认为您应该观看PowerShell或任何其他能够轻松执行脚本任务的编程语言(Python,Perl,PHP,Ruby)
要获取当前目录,您可以使用:
CD > tmpFile SET /p myvar= < tmpFile DEL tmpFile echo test: %myvar%
虽然它正在使用临时文件,但它并不是最漂亮的,但它确实有效!'CD'将当前目录放在'tmpFile'中,'SET'加载tmpFile的内容.
这是一个带有"数组"的多行的解决方案:
@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或为这些东西创建一个应用程序.它正在扩展批处理文件的可能性.
您需要使用SET
带参数的命令/P
并将输出定向到它.例如,请参阅http://www.ss64.com/nt/set.html.将适用于CMD,不确定.BAT文件
从评论到这篇文章:
该链接有命令"
Set /P _MyVar=
",表示它将设置 _MyVar
为第一行MyFilename.txt
.这可以用作"myCmd > tmp.txt
"和"set /P myVar=
".但它只会获得输出的第一行,而不是所有输出
在"V"环境变量中设置最新文件的示例
FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I
在批处理文件中,您必须在循环变量中使用双前缀:
FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I