2010-02-24 43 views
195

我需要使用MS批處理文件將程序的輸出分配給變量。將程序的輸出分配給變量

所以在GNU Bash shell中,我會使用VAR=$(application arg0 arg1)。我需要在Windows中使用批處理文件的類似行爲。

類似於set VAR=application arg0 arg1

回答

292

一種方法是:

application arg0 arg1 > temp.txt 
set /p VAR=<temp.txt 

另一個原因是:

for /f %%i in ('application arg0 arg1') do set VAR=%%i 

注意,在%%i第一%用於轉義它後%和使用在一個批處理文件,而不是在命令行上的上述代碼時是需要的。試想一下,你的test.bat有這樣的:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i 
echo %datetime% 
+7

這是一個很棒的技巧,我想知道它爲什麼不能用於管道 – 2013-04-10 22:26:14

+11

這隻適用於單行文本的輸出(在第一個換行符後省略後續行)。 – GroovyCakes 2015-08-07 21:46:08

+14

@Machta在parens的表達式中,必須在它之前用^符號轉義管道。例如:'for/f「tokens = 3」%%我在('route print^| findstr「\ <0.0.0.0\>」')設置「myVar = %% i」' – 2015-08-19 22:54:54

6

假設你的應用程序的輸出是一個數字返回碼,你可以做以下

application arg0 arg1 
set VAR=%errorlevel% 
+2

不幸的是,輸出是一個字符串。 – initialZero 2010-02-24 03:08:30

+0

好的。我會保留這爲後代,但看看@ jdigital的鏈接,它談到輸出管道到臨時文件。 – akf 2010-02-24 03:19:37

+0

程序輸出到stdout和stderr不同於它的整數返回值。程序既可以像上面例子那樣返回一個整數值,同時也可以向控制檯發送一個字符串(或者重定向到一個文件或其他地方)。它們不是相互排斥的,而是兩個不同的概念。 – 2016-11-17 19:45:25

7

@OP,您可以使用for loops捕捉到你的程序的返回狀態,如果它輸出數字以外的東西

51

作爲除了this previous answer,管道可在for語句中使用,通過一個插入符號符號轉義:

for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 
+1

兩個重要的問題:使用令牌捕捉和脫口而出逃管道。 – 2014-10-29 12:13:46

+0

等效版本,在CLI上工作,可以複製粘貼,以更容易擺弄:'for/f「標記= *」%i在('任務列表^ | findstr資源管理器')做@echo%i'但一般來說, 'usebackq'應該用來處理複雜的命令。 – 2017-12-14 16:33:12

1

除了答案,不能直接在集合部分for循環中使用輸出重定向操作符(例如,如果要隱藏用戶的stderror輸出並提供更好的錯誤消息)。取而代之的是,你有一個脫字符(^)逃脫他們:

for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O) 

參考:Redirect output of command in for loop of batch script

0
@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

REM Prefer backtick usage for command output reading: 
REM ENABLEDELAYEDEXPANSION is required for actualized 
REM outer variables within for's scope; 
REM within for's scope, access to modified 
REM outer variable is done via !...! syntax. 

SET CHP=C:\Windows\System32\chcp.com 

FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO (
    IF "%%i" == "Aktive" IF "%%j" == "Codepage:" (
     SET SELCP=%%k 
     SET SELCP=!SELCP:~0,-1! 
    ) 
) 
echo actual codepage [%SELCP%] 

ENDLOCAL 
2

上執行:for /f %%i in ('application arg0 arg1') do set VAR=%%i我是越來越錯誤:%%我是意外的在這個時候。 作爲一個修復,我必須執行以上爲for /f %i in ('application arg0 arg1') do set VAR=%i

+1

在一個批處理文件中,你需要'%%'並且在命令行上的一個批處理文件之外,你需要'%' – 2017-07-25 05:29:44