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ể đặ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âu trả lời:
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
ENABLEDELAYEDEXPANSION
|
trong trường hợp không hoạt động.
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 do
khối). Vì vậy, tôi đoán một số phần của for
cấ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.
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.
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
Để đọ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
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ọ.
Nếu bạn đang chạy từ trong một .bat
tệ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.json
một biến có tên AWS_ACCESS_KEY
thì 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")
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.json
một biến có tên AWS_ACCESS_KEY
thì 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")
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 USEBACKQ
dò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ó.
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
, tokens
hoặc usebackq
trong for
vòng lặp.
Đã thử nghiệm trên Win 10 CMD.
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
appcmd
khô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
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 *.txt
lệnh "" chứ không phải lệnh echo %var%
. Tôi đã nhầm lẫn vì cả hai đầu ra là như nhau.
pipe the command into a variable prompt
thì 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 đó!
Hy vọng điều này giúp đỡ
set a=%username%
echo %a%
set a="hello"
echo %a%