Bir ifadenin toplu iş dosyası çıktısını bir değişkene ayarlamak mümkün müdür, örneğin:
findstr testing > %VARIABLE%
echo %VARIABLE%
Bir ifadenin toplu iş dosyası çıktısını bir değişkene ayarlamak mümkün müdür, örneğin:
findstr testing > %VARIABLE%
echo %VARIABLE%
Yanıtlar:
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%
Eklemek için bir dizeniz veya uzun bir dosya adınız varsa, komutu bozmadan çift tırnaklarınızı kullanabilmeniz için her zaman USEBACKQ kullanıyorum.
Şimdi çıktınız birden fazla satır içerecekse bunu yapabilirsiniz
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
|
, bu durumda işe yaramazsa iyi çalışır.
command
lütfen? Sıfır olmayan bir kod döndürüyor eminim ama %ERRORLEVEL%
her zaman 0 içerir, nerede kullanmaya çalışacağım önemli değil (hatta do
blok içinde ). Sanırım bu for
yapının bir kısmı üzerine yazılıyor. BTW Bu kadar basit bir şey için çılgın görünümlü kodun ne kadar gerekli olduğu inanılmaz.
Bulduğum Konuyu orada Interweb şey bu konuda. İndirgenir:
@echo off
setlocal enableextensions
for /f "tokens=*" %%a in (
'VER'
) do (
set myvar=%%a
)
echo/%%myvar%%=%myvar%
pause
endlocal
Ayrıca bir komutun çıktısını geçici bir dosyaya yönlendirebilir ve daha sonra bu geçici dosyanın içeriğini beğeninize değişken olarak ekleyebilirsiniz. Gerçi çok satırlı girdi ile çalışmaz.
cmd > tmpFile
set /p myvar= < tmpFile
del tmpFile
Tom's Hardware başlıklı konuya teşekkür ederiz.
tek bir satırda:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
komut çıkışı% g sonra VAR olarak ayarlanır.
Daha fazla bilgi: https://ss64.com/nt/for_cmd.html
Bir dosyayı okumak için ...
set /P Variable=<File.txt
Dosya yazmak için
@echo %DataToWrite%>File.txt
Not; <> karakterinden önce boşluk olması değişkenin sonuna boşluk eklenmesine neden olur.
Bir günlükçü programı gibi bir dosyaya eklemek için, önce içinde e.txt adlı tek bir giriş tuşu bulunan bir dosya oluşturun
set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt
günlüğün şöyle görünecek
Entry1
Entry2
ve bunun gibi
Her neyse birkaç yararlı şey
Bu cevapların hepsi ihtiyacım olan cevaba çok yakındı. Bu onları genişletme çabasıdır.
Bir .bat
dosyadan çalıştırıyorsanız ve jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
adlı bir değişkene benzer karmaşık bir komutu dışa aktarmanıza izin veren tek bir satır istiyorsanız, AWS_ACCESS_KEY
bunu istiyorsanız:
FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
İstendiğinde, adlı bir değişkene C:\
benzer karmaşık bir komut çalıştırmanıza izin veren tek bir satır istiyorsanız, bunu istiyorsanız:jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
AWS_ACCESS_KEY
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
Yukarıdaki iki cevap arasındaki tek fark, komut satırında değişkeninizde tek bir% kullanmanızdır. Bir toplu iş dosyasında, yüzde işaretlerini (%%) ikiye katlamanız gerekir.
Komut, iki nokta üst üste, tırnak işaretleri ve parantez içerdiğinden, USEBACKQ
çalıştırılacak komutu ve ardından içindeki her tür komik karakteri belirtmek için geri tırnakları kullanabilmeniz için satırı seçeneklere eklemeniz gerekir.
Bir geçici dosyaya çıktı almak ve daha sonra bir değişkene okumak istemiyorsanız, bu kod komutun sonucunu doğrudan bir değişkene depolar:
FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%
Arama dizesini çift tırnak içine almak istiyorsanız:
FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i
Bu kodu bir toplu iş dosyasında saklamak istiyorsanız, fazladan bir% simgesi ekleyin:
FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i
Bir dizindeki dosya sayısını ve bir değişkende saklamak için yararlı bir örnek: (boruları gösterir)
FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i
Yerine komut parantez içinde çift tırnak "ya da aksan` tek tırnak kullanımına dikkat edin. Bu temizleyici için alternatif delims
, tokens
ya usebackq
içinde for
döngü.
Win 10 CMD üzerinde test edildi.
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
standart bir program değildir ve bir değişkene program çıktısını nereye atadığınızı göremiyorum. Sonunda biraz daha açıklamaya ihtiyacın var
Ben böyle test ve çalıştı:
SET /P Var= | Cmd
Komutu bir değişkene pipetlediğinizde, komut istemi " Cmd
" komutunun sonucunu " " değişkenine ekler Var
.
Güncelleme:
İşe yaramıyor, benim kötü, yaptığım komut şuydu:
SET /P Var= | dir /b *.txt
echo %Var%
Aslında " test.txt
" diyelim , ama aslında " dir /b *.txt
" komutunun sonucunu gösteriyordu echo %var%
. Her iki çıktı da aynı olduğu için kafam karıştı.
pipe the command into a variable prompt
yazmış olmalısınız dir /b *.txt | SET /P Var=
. PS: Bu da işe yaramıyor!
Umarım bu yardım
set a=%username%
echo %a%
set a="hello"
echo %a%