Cách đặt đầu ra lệnh dưới dạng một biến trong tệp bó


242

Có thể đặt đầu ra của một câu lệnh của tệp bó thành một biến không, ví dụ:

findstr testing > %VARIABLE%

echo %VARIABLE%



có thể trùng lặp các tệp bó
Nathan

một bản sao khác chỉ để giải trí: Lô Windows gán đầu ra của chương trình cho một biến
icc97

Câu trả lời:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

Tôi luôn sử dụng USEBACKQ để nếu bạn có một chuỗi để chèn hoặc tên tệp dài, bạn có thể sử dụng dấu ngoặc kép của mình mà không làm hỏng lệnh.

Bây giờ nếu đầu ra của bạn sẽ chứa nhiều dòng, bạn có thể làm điều này

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
Làm việc cho tôi trong hệ thống Win7, cảm ơn! (và vâng, đó là 7 năm hữu ích) PS Đừng quên mở rộng% thành %% trong các lệnh!
Dmitry Ilukhin

Điều này hoạt động rất tốt ... trừ khi đầu ra chứa các dấu chấm than (!), Vì chúng sẽ được hiểu là các ký tự điều khiển khi sử dụngENABLEDELAYEDEXPANSION
JonathanDavidArndt

Nó hoạt động tốt, trừ khi bạn cần sử dụng |trong trường hợp không hoạt động.
Matt Vukomanovic

5
@MattVukomanovic nó hoạt động với tôi bằng cách sử dụng ^|thay thế |, như được mô tả ở đây
AST

Có thể nắm bắt mã thoát của bất cứ cách nào command, xin vui lòng? Tôi chắc chắn rằng nó sẽ trả về một mã khác không nhưng %ERRORLEVEL%luôn chứa 0, bất kể tôi cố gắng sử dụng nó ở đâu (ngay cả trong dokhối). Vì vậy, tôi đoán một số phần của forcấu trúc đó là ghi đè lên nó. BTW Thật không thể tin được làm thế nào mã tìm kiếm điên rồ là cần thiết cho một cái gì đó rất cơ bản.
David Ferenczy Rogožan

68

Tôi tìm thấy chủ đề này trên đó có điều Interweb. Luộc xuống:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

Bạn cũng có thể chuyển hướng đầu ra của một lệnh sang một tệp tạm thời, sau đó đưa nội dung của tệp tạm thời đó vào biến của bạn, likeuchasherwise. Nó không hoạt động với đầu vào đa dòng mặc dù.

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Tín dụng cho chủ đề trên Phần cứng của Tom.


3
Chỉ có nhược điểm đối với cách tiếp cận dưới cùng (được ưu tiên hơn trong tất cả các cách khác) là nó không hoạt động với đầu ra đa dòng.
dgo

Đối với VER tôi sẽ đi theo một cách khác: for / f "tokens = 2 delims = [,]" %% a in ('ver') làm phiên bản %% a echo% phiên bản%
Hardoman

1
bạn là kết quả thứ hai cho likeuchasherwise - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

Ví dụ thứ hai của bạn đã giúp tôi rất nhiều trong việc viết một tệp bó để kiểm tra phiên bản của chromedriver.exe so với tệp văn bản có chứa số phiên bản. Tôi là một con khủng long DOS cũ và không biết các công tắc chuyển sang lệnh set. Những thứ khác là quá mức cần thiết cho tôi.
Bill Hileman

47

trong một dòng duy nhất:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

đầu ra lệnh sẽ được đặt ở% g sau đó trong VAR.

Thêm thông tin: https://ss64.com/nt/for_cmd.html


19
Lô của tôi không chạy với "% g". Nó chạy với "%% g".
Santiago Villafuerte

5
+ Santiago Villafuerte: có, nếu bạn đang chạy từ một tệp bó, nhưng nếu bạn muốn tự chạy nó từ dòng lệnh (ví dụ: để kiểm tra nó trước khi đưa nó vào tệp bó) thì bạn sử dụng một% duy nhất.
Brent Rittenhouse

19

Để đọc một tập tin ...

set /P Variable=<File.txt

Để viết một tập tin

@echo %DataToWrite%>File.txt

Ghi chú; có khoảng trắng trước ký tự <> làm cho một khoảng trắng được thêm vào cuối biến, cũng

Để thêm vào một tệp, như chương trình logger, Đầu tiên hãy tạo một tệp có một phím nhập duy nhất trong đó gọi là e.txt

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

nhật ký của bạn sẽ như thế này

Entry1
Entry2 

và như thế

Dù sao một vài điều hữu ích


Cảm ơn bạn vì câu trả lời. BTW "set / P Biến = <File.txt" chỉ đọc dòng đầu tiên của tệp
Deepscorn

18

Những câu trả lời này rất gần với câu trả lời mà tôi cần. Đây là một nỗ lực để mở rộng về họ.

Trong một tập tin hàng loạt

Nếu bạn đang chạy từ trong một .battệp và bạn muốn một dòng duy nhất cho phép bạn xuất một lệnh phức tạp như jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonmột biến có tên AWS_ACCESS_KEYthì bạn muốn điều này:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

Trên dòng lệnh

Nếu bạn đang ở C:\dấu nhắc bạn muốn một dòng duy nhất cho phép bạn chạy một lệnh phức tạp như jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonmột biến có tên AWS_ACCESS_KEYthì bạn muốn điều này:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

Giải trình

Sự khác biệt duy nhất giữa hai câu trả lời ở trên là trên dòng lệnh, bạn sử dụng một% duy nhất trong biến của mình. Trong một tệp bó, bạn phải nhân đôi số phần trăm (%%).

Vì lệnh bao gồm dấu hai chấm, dấu ngoặc kép và dấu ngoặc đơn, bạn cần bao gồm USEBACKQdòng trong các tùy chọn để bạn có thể sử dụng backquote để chỉ định lệnh chạy và sau đó là tất cả các loại ký tự vui nhộn bên trong nó.


12

Nếu bạn không muốn xuất ra tệp tạm thời và sau đó đọc thành một biến, mã này sẽ lưu kết quả của lệnh trực tiếp vào một biến:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

Nếu bạn muốn kèm theo chuỗi tìm kiếm trong dấu ngoặc kép:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

Nếu bạn muốn lưu trữ mã này trong một tệp bó, hãy thêm ký hiệu%:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

Một ví dụ hữu ích để đếm số lượng tệp trong một thư mục và lưu trữ trong một biến: (minh họa đường ống)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

Lưu ý việc sử dụng dấu nháy đơn thay vì dấu ngoặc kép "hoặc dấu huyền` trong khung lệnh. Đây là sạch thay thế cho delims, tokenshoặc usebackqtrong forvòng lặp.

Đã thử nghiệm trên Win 10 CMD.


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

Tôi không thể thấy điều này giải quyết câu hỏi như thế nào. appcmdkhông phải là một chương trình tiêu chuẩn và tôi không thể thấy nơi bạn gán đầu ra chương trình cho một biến. Cuối cùng, bạn cần thêm một số giải thích
jeb

-3

Tôi đã thử nó như thế này và nó đã hoạt động:

SET /P Var= | Cmd

Bằng cách dẫn lệnh vào một biến, prompt sẽ chèn kết quả của lệnh " Cmd" vào biến " Var".

Cập nhật:

Nó không hoạt động, xấu của tôi, kịch bản tôi đã làm là thế này:

SET /P Var= | dir /b *.txt
echo %Var%

Nó thực sự hiển thị, hãy nói " test.txt", nhưng thực tế nó cho thấy kết quả của dir /b *.txtlệnh "" chứ không phải lệnh echo %var%. Tôi đã nhầm lẫn vì cả hai đầu ra là như nhau.


3
Nếu bạn đã có ý định pipe the command into a variable promptthì bạn nên viết nó dir /b *.txt | SET /P Var=để có hướng chính xác. PS: Nó cũng không hoạt động theo cách đó!
Jesse Chisholm

-18

Hy vọng điều này giúp đỡ

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
Không, điều này không trả lời câu hỏi. Câu hỏi sắp có được đầu ra của lệnh thành một biến
jeb

Cách dễ dàng là ghi vào một tệp và đọc nó từ tệp đó. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.