/ / Variable Scope - zmienna dostępowa poza pętlą for - Windows Batch - okna, powłoki, pętle, plik wsadowy, linia poleceń

Variable Scope - zmienna dostępowa poza pętlą for - Windows Batch - okna, powłoki, pętle, plik wsadowy, linia poleceń

Jak uzyskać dostęp do zmiennej! Processid! poza pętlą for? Nie mogę zmusić go do działania

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SETLOCAL

FOR /F "tokens=* skip=1 delims=" %%a in (""wmic PROCESS WHERE "CommandLine LIKE "%%scanforstring%%" AND NOT CommandLine LIKE "%%WMIC%%"" get processid"") do (
set prozessid=%%a
echo !prozessid!
)

echo !prozessid!

PAUSE
endlocal

Odpowiedzi:

1 dla odpowiedzi № 1

Problem z twoim kodem polega na tym, że wyjście z pliku wmic polecenie zawiera linie kończące, które nadpisują pobrany identyfikator procesu. Możesz przypisać zmienną tylko wtedy, gdy nie ma wartości

set "prozessid="
for /f ...... do (
if not defined prozessid (
set "prozessid=%%a"
echo !prozessid!
)
)

Lub możesz filtrować wyjście pliku wmic polecenie, aby przetwarzać tylko prawidłowe wiersze

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "usebackq tokens=2 delims==" %%a in (`
wmic PROCESS WHERE "
CommandLine LIKE "%%scanforstring%%"
AND NOT CommandLine LIKE "%%WMIC%%"
" get processid /value
`) do (
set prozessid=%%a
echo 1 - !prozessid!
)

echo 2 - !prozessid!

PAUSE
endlocal

Zmiany dokonane:

1 - Zmieniono wmic zapytanie do użycia /value więc otrzymujemy dane wyjściowe w formacie key=value

2 - Zmieniono for /f opcje używania znaku równości jako ogranicznika i pobierania tylko drugiego tokena w wierszu, więc przetwarzana jest tylko linia z wartością %%a będzie trzymał pid

3 - Po prostu kosmetyczne, zmienione for /f używać usebackq i zmienił cytowanie w wmic dowództwo