Czy można ustawić wyjście instrukcji wsadowej pliku wsadowego na zmienną, na przykład:
findstr testing > %VARIABLE%
echo %VARIABLE%
Czy można ustawić wyjście instrukcji wsadowej pliku wsadowego na zmienną, na przykład:
findstr testing > %VARIABLE%
echo %VARIABLE%
Odpowiedzi:
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%
Zawsze używam USEBACKQ, więc jeśli masz ciąg do wstawienia lub długą nazwę pliku, możesz użyć podwójnych cudzysłowów bez spieprzenia polecenia.
Teraz, jeśli twój wynik będzie zawierał wiele wierszy, możesz to zrobić
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
|
w którym to przypadku nie działa.
command
? Jestem pewien, że zwraca niezerowy kod, ale %ERRORLEVEL%
zawsze zawiera 0, bez względu na to, gdzie próbuję go użyć (nawet wewnątrz do
bloku). Więc chyba część tego for
konstruktu go nadpisuje. BTW To niewiarygodne, jak szalenie wyglądający kod jest potrzebny do czegoś tak podstawowego.
Znalazłem ten wątek na tamtej stronie Interweb. Sprowadza się do:
@echo off
setlocal enableextensions
for /f "tokens=*" %%a in (
'VER'
) do (
set myvar=%%a
)
echo/%%myvar%%=%myvar%
pause
endlocal
Możesz także przekierować dane wyjściowe polecenia do pliku tymczasowego, a następnie umieścić zawartość tego pliku tymczasowego w zmiennej, tak jak to ma miejsce. Jednak nie działa z wejściem wieloliniowym.
cmd > tmpFile
set /p myvar= < tmpFile
del tmpFile
Podziękowania dla wątku na sprzęcie Toma.
w jednym wierszu:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
wynik polecenia zostanie ustawiony w% g, a następnie w VAR.
Więcej informacji: https://ss64.com/nt/for_cmd.html
Aby odczytać plik ...
set /P Variable=<File.txt
Aby zapisać plik
@echo %DataToWrite%>File.txt
Uwaga; spacje przed znakiem <> powodują także dodanie spacji na końcu zmiennej
Aby dodać do pliku, podobnie jak program rejestrujący, najpierw utwórz plik z jednym klawiszem Enter o nazwie e.txt
set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt
Twój dziennik będzie wyglądał tak
Entry1
Entry2
i tak dalej
W każdym razie kilka przydatnych rzeczy
Wszystkie te odpowiedzi były tak bliskie odpowiedzi, której potrzebowałem. To jest próba rozwinięcia się na nich.
Jeśli uruchamiasz się z .bat
pliku i potrzebujesz jednej linii, która pozwala wyeksportować skomplikowane polecenie, np. jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
Do zmiennej o nazwie, AWS_ACCESS_KEY
to chcesz:
FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
Jeśli pojawi się C:\
monit, potrzebujesz pojedynczej linii, która pozwala na uruchomienie skomplikowanego polecenia, takiego jak jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
zmienna o nazwie, AWS_ACCESS_KEY
to chcesz:
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
Jedyna różnica między dwiema powyższymi odpowiedziami polega na tym, że w wierszu poleceń używasz jednego% w zmiennej. W pliku wsadowym należy podwoić znaki procentowe (%%).
Ponieważ polecenie zawiera dwukropki, cudzysłowy i nawiasy, należy włączyć USEBACKQ
wiersz w opcjach, aby można było użyć cudzysłowów w celu określenia polecenia do uruchomienia, a następnie wszelkiego rodzaju zabawnych znaków w nim zawartych.
Jeśli nie chcesz wyprowadzać danych do pliku tymczasowego, a następnie wczytywać do zmiennej, ten kod przechowuje wynik polecenia bezpośrednio w zmiennej:
FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%
Jeśli chcesz zawrzeć szukany ciąg w podwójnych cudzysłowach:
FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i
Jeśli chcesz zapisać ten kod w pliku wsadowym, dodaj dodatkowy symbol%:
FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i
Przydatny przykład zliczania liczby plików w katalogu i przechowywania w zmiennej: (ilustruje potokowanie)
FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i
Zauważ użycie pojedynczych cudzysłowów zamiast cudzysłowach "lub akcentem` w nawiasach poleceń. To jest czystsze alternatywa delims
, tokens
lub usebackq
w for
pętli.
Testowany na 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
nie jest standardowym programem i nie widzę, gdzie przypisujesz wyjście programu do zmiennej. W końcu potrzebujesz więcej wyjaśnień
Przetestowałem to w ten sposób i zadziałało:
SET /P Var= | Cmd
Przesyłając polecenie do zmiennej, monit wstawi wynik polecenia „ Cmd
” do zmiennej „ Var
”.
Aktualizacja:
To nie działa, mój zły, skrypt, który napisałem był następujący:
SET /P Var= | dir /b *.txt
echo %Var%
Właściwie pokazywał, powiedzmy „test.txt
”, ale w rzeczywistości pokazywał wynik dir /b *.txt
polecenia „ ”, a nie echo %var%
. Byłem zdezorientowany, ponieważ oba wyjścia były takie same.
pipe the command into a variable prompt
to zrobić, powinieneś to napisać, dir /b *.txt | SET /P Var=
aby uzyskać prawidłowy kierunek rury. PS: To też nie działa w ten sposób!
Mam nadzieję, że to pomoże
set a=%username%
echo %a%
set a="hello"
echo %a%