Çıxış proqramı dəyişəninin məqsədi

Bir MS komanda faylını istifadə edərək proqramın çıxışını bir dəyişənə təyin etməliyik.

Beləliklə, GNU Bash kabuğunda VAR=$(application arg0 arg1) istifadə VAR=$(application arg0 arg1) . Bir toplu iş faylını istifadə edərək, Windows-da oxşar bir davranışa ehtiyacım var.

set VAR=application arg0 arg1 kimi bir şey set VAR=application arg0 arg1 .

227
24 февр. initialZero dəsti 24 fevral. 2010-02-24 05:33 '10 at 5:33 2010-02-24 05:33
@ 11 cavab

Bir yol:

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

Digər bir:

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

%%i ildə ilk % % sonra % çıxmaq və yuxarıda göstərilən kodu komanda xəttində deyil, toplu işdə istifadə etmək üçün istifadə edildiyini unutmayın. test.bat kimi bir şey olduğunu düşünün:

 for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i echo %datetime% 
348
26 февр. 26 Fevralda Carlos Gutiérrez tərəfindən verilmiş cavab 2010-02-26 10:13 '10 at 10:13 2010-02-26 10:13

Bu əvvəlki cavanlığa əlavə olaraq, boruları, karet sembolü ilə qorunan ifadələr üçün istifadə edilə bilər:

border=0
  for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 
56
18 окт. Renat tərəfindən 18 oktyabrda cavab verildi 2013-10-18 10:11 '13 at 10:11 2013-10-18 10:11

@OP, nömrələrdən başqa bir şey çıxarsa proqramınızın qaytarma vəziyyətini göstərmək üçün looplar üçün istifadə edə bilərsiniz

8
24 февр. Cavab ghostdog74 24 fevralda verilir. 2010-02-24 05:47 '10 at 5:47 2010-02-24 05:47

Tətbiq çıxışınızı nümunəvi qaytarma kodu hesab edirsən, aşağıdakıları edə bilərsiniz

 application arg0 arg1 set VAR=%errorlevel% 
6
24 февр. Cavab akf 24 feb tərəfindən verilir . 2010-02-24 05:37 '10 at 5:37 2010-02-24 05:37

İcra edərkən: for /f %%i in ('application arg0 arg1') do set VAR=%%i etdim səhv aldım: %% Bu zaman gözlənilməz oldu. Bir düzəliş olaraq yuxarıda yuxarıdan for /f %i in ('application arg0 arg1') do set VAR=%i

4
07 дек. Munish Mehta tərəfindən verilmiş cavab 07 Dek 2016-12-07 14:14 '16 'da 14:14' də 2016-12-07 14:14

Cavabın yanına, for döngünün müəyyən bir hissəsində çıxış redirection ifadələrini birbaşa istifadə edə bilməzsiniz (məsələn, istifadəçidən stderror çıxışını gizlətmək və daha xoş bir səhv mesajı vermək istəsəniz). Bunun əvəzinə, bunları karet ( ^ ) simvolundan çəkinməlisiniz:

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

Link: Komut buraxılışını skript loopuna yönləndirin

1
15 июля '15 в 14:46 2015-07-15 14:46 Cavab Kubo2 tərəfindən 15 İyul 15 : 14 -da verilir. 2015-07-15 14:46

Daha əvvəl də Wolf ilə xarakterizə olunmuşdur.

%% I-in birinci% -dən sonra çıxış üçün istifadə olunur və yuxarıda göstərilən kodu komanda xəttində deyil, toplu işdə istifadə edərkən istifadə edilməlidir. Sizin test.bat kimi bir şey var düşünün:

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

0
05 дек. cevap 05 dekabrda verilir . 2017-12-05 00:56 '17 'də 0:56 2017-12-05 00:56

Google.com-a hər 5 saniyədə ping göndərən və nəticələrini cari vaxtla birləşdirən bir skript yazdım. Burada "commandLineStr" dəyişənləri (indekslərlə) üçün çıxış tapa bilərsiniz.

 @echo off :LOOPSTART echo %DATE:~0% %TIME:~0,8% >> Pingtest.log SETLOCAL ENABLEDELAYEDEXPANSION SET scriptCount=1 FOR /F "tokens=* USEBACKQ" %%F IN ('ping google.com -n 1') DO ( SET commandLineStr!scriptCount!=%%F SET /a scriptCount=!scriptCount!+1 ) @ECHO %commandLineStr1% >> PingTest.log @ECHO %commandLineStr2% >> PingTest.log ENDLOCAL timeout 5 > nul GOTO LOOPSTART 
0
02 апр. Cavab Ja Vy tərəfindən verilir 02 Apr 2018-04-02 15:25 '18 də 3:25 pm 2018-04-02 15:25

Batch qabığının davranışı kimi bir əmri əmələ gətirə bilmək üçün bir toplu makro istifadə edə bilərsiniz.

Bir makro istifadə edərək, sadə və görünür

 %$set% VAR=application arg1 arg2 

Və hətta borularla işləyir.

 %$set% allDrives="wmic logicaldisk get name /value | findstr "Name"" 

Makro dəyişənləri bir sıra kimi istifadə edir və hər bir satırı ayrı bir indeksi saxlayır.
Aşağıdakı dəyişənlər nümunədə yaradılacaq: %$set% allDrives="wmic logicaldisk :

 allDrives.Len=5 allDrives.Max=4 allDrives[0]=Name=C: allDrives[1]=Name=D: allDrives[2]=Name=F: allDrives[3]=Name=G: allDrives[4]=Name=Z: 

Onu istifadə etmək üçün makroyun özünün necə işlədiyini anlamaq vacib deyil.

Tam nümunə

 @echo off setlocal call :initMacro %$set% ipOutput="ipconfig" call :ShowVariable ipOutput echo First line is %ipOutput[0]% echo( %$set% driveNames="wmic logicaldisk get name /value | findstr "Name"" call :ShowVariable driveNames exit /b :ShowVariable setlocal EnableDelayedExpansion for /L %%n in (1 1 !%~1.len!) do ( echo %%n: !%~1[%%n]! ) echo( exit /b :initMacro if "!!"=="" ( echo ERROR: Delayed Expansion must be disabled while defining macros (goto) 2>nul (goto) 2>nul ) (set \n=^^^ %=empty=% ) set $set=FOR /L %%N in (1 1 2) DO IF %%N==2 ( %\n% for /f "tokens=1,* delims== " %%1 in ("!argv!") do ( %\n% endlocal %\n% endlocal %\n% set "%%~1.Len=0" %\n% if "!!"=="" ( %\n% %= Used if delayed expansion is enabled =% %\n% for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n% setlocal DisableDelayedExpansion %\n% set pathExt=: %\n% set "line=%%O" %\n% call set ^"line=%%line:"="Q"%%" %\n% call set "line=%%line:!="B"!%%" %\n% setlocal EnableDelayedExpansion %\n% set "line=!line:^=^^!" %\n% set "line=!line:"B"=^!" %\n% set "line=!line:"Q"=^"!^" %\n% set "line="!line:*:=!"" %\n% for /F %%C in ("!%%~1.Len!") DO ( %\n% FOR /F "delims=" %%L in ("!line!") DO ( %\n% endlocal %\n% endlocal %\n% set "%%~1[%%C]=%%~L" ! %\n% ) %\n% set /a %%~1.Len+=1 %\n% ) %\n% ) %\n% ) ELSE ( %\n% %= Used if delayed expansion is disabled =% %\n% for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n% setlocal DisableDelayedExpansion %\n% set "line=%%O" %\n% setlocal EnableDelayedExpansion %\n% set "line="!line:*:=!"" %\n% for /F %%C in ("!%%~1.Len!") DO ( %\n% FOR /F "delims=" %%L in ("!line!") DO ( %\n% endlocal %\n% endlocal %\n% set "%%~1[%%C]=%%~L" %\n% ) %\n% set /a %%~1.Len+=1 %\n% ) %\n% ) %\n% ) %\n% set /a %%~1.Max=%%~1.Len-1 %\n% ) %\n% ) else setlocal EnableDelayedExpansion^ argv= goto :eof 
0
29 янв. Cavab verildi Jan 29 2019-01-29 19:14 '19 19:14 'da

Boruların istifadəsi daha sadə / təmiz və daha sıxdır.

ərəb arg0 arg1 | set / P çıxış =

0
05 дек. Cavab Calin Pirtea verildi 05 dekabr. 2017-12-05 00:56 '17 'də 0:56 2017-12-05 00:56
 @echo off SETLOCAL ENABLEDELAYEDEXPANSION REM Prefer backtick usage for command output reading: REM ENABLEDELAYEDEXPANSION is required for actualized REM outer variables within for scope; REM within for 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 
0
01 сент. cavab rcm verilir 01 Sep 2016-09-01 16:22 '16 saat 16:22 'da 2016-09-01 16:22