Ich muss es ein zweites Mal ausführen (manchmal 3-4 Mal), um die SID tatsächlich auszudrucken
Ihre Batchdatei verwendet keine setlocal oder delayedexpansion. Sie funktioniert also nur, wenn %user%
sie in der Umgebung definiert ist, in der die Batchdatei aufgerufen wird .
Aufgrund des Fehlens von setlocal
Variablen, die in der Stapeldatei enthalten sind, werden diese in die aufrufende Befehls-Shell durchgesickert und sind dann beim nächsten Aufruf der Stapeldatei verwendbar.
Innerhalb der Batchdatei (beim ersten Aufruf) ist% user% in der Batchdatei nicht verwendbar, da in einem Codeblock ( if
) darauf verwiesen wird :
Wenn eine Batchdatei ausgeführt wird, analysiert der Befehlsprozessor (CMD.exe) vollständige Zeilen und führt zusammengesetzte Befehle aus . Variablen werden nur einmal durch ihre Werte ersetzt, BEVOR die Befehle der Zeile ausgeführt werden.
Wenn Sie delayedexpansion aktivieren :
Bei einer verzögerten Erweiterung werden Variablen in einer Batchdatei nicht zur Analysezeit, sondern zur Ausführungszeit erweitert. Diese Option wird mit dem Befehl SETLOCAL EnableDelayedExpansion aktiviert.
Wenn Sie die Batchdatei zum ersten Mal aufrufen, %user%
ist sie zur Ausführungszeit nicht definiert, und der WMIC
Befehl schlägt mit dem in der Frage angegebenen Fehler fehl.
Beim zweiten Aufruf der Batchdatei %user%
wird definiert (mit dem Wert aus der vorherigen Ausführung und Ihre Batchdatei scheint zu funktionieren.)
Wenn Sie beim zweiten Aufruf Ihrer Batch-Datei einen anderen Benutzernamen eingeben, wird die falsche SID zurückgegeben (der Benutzername wird beim ersten Aufruf verwendet).
Sie müssen die folgenden Änderungen vornehmen:
Fügen Sie
setlocal enabledelayedexpansion
am Anfang der Batchdatei.Ersetzen
%util%
durch!util!
Geänderte Batchdatei:
@echo off setlocal enabledelayedexpansion if %errorLevel% == 0 ( SET Users="dir C:\Users\ /B" for /F "tokens=2,*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /v ProfileImagePath /s ^| find "REG_EXPAND_SZ" ^| findstr /v /i "\\windows\\ \\system32\\"') do ( echo %%~nb echo. ) echo. SET /p "util=Type the username" echo !util! for /f "delims= " %%a in ('"wmic path win32_useraccount where name='!util!' get sid"') do ( if not "%%a"=="SID" ( set _sid=%%a goto :loop_end ) ) ) else ( for /f "delims= " %%a in ('"wmic path win32_useraccount where name='%USERNAME%' get sid"') do ( if not "%%a"=="SID" ( set _sid=%%a goto :loop_end ) ) ) :loop_end echo %%_sid%%=%_sid% endlocal
Verwendungsbeispiel:
> test DavidPostill ntp Administrator Type the usernameDavidPostill DavidPostill %_sid%=S-1-5-21-1699878757-1063190524-3119395976-1000
Lesen Sie weiter
- Ein AZ-Index der Windows CMD-Befehlszeile
- Eine kategorisierte Liste von Windows CMD-Befehlen
- enabledelayedexpansion - Eine verzögerte Erweiterung bewirkt, dass Variablen nicht zur Analysezeit, sondern zur Ausführungszeit erweitert werden.
- setlocal - Legen Sie Optionen fest, um die Sichtbarkeit von Umgebungsvariablen in einer Batchdatei zu steuern.