WMIC-Fehler: Nach der ersten Ausführung meines Stapelskripts sind keine Instanzen verfügbar

2

Ich führe cmd.exe als Administrator aus und führe dieses Skript aus. Wenn ich es zum ersten Mal ausführe, bekomme ich es immer wieder Instances Available. Ich muss es ein zweites Mal ausführen (manchmal 3-4 Mal), um die SID tatsächlich zu drucken. Warum?

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"

    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%
user745333
quelle

Antworten:

0

Ich muss es ein zweites Mal ausführen (manchmal 3-4 Mal), um die SID tatsächlich zu drucken

Ihre Stapeldatei verwendet keine setlocal oder delayedexpansion, daher funktioniert sie nur, wenn %user%sie in der Umgebung definiert ist, die die Stapeldatei aufruft .

Aufgrund des Fehlens von setlocalVariablen, die in der Batchdatei festgelegt sind, werden sie in die aufrufende Befehlsshell übertragen und können dann beim nächsten Aufruf der Batchdatei verwendet werden.

In der Stapeldatei (beim ersten Aufruf) kann% user% nicht in der Stapeldatei verwendet werden, da in einem Codeblock ( if) darauf verwiesen wird :

Wenn eine Stapeldatei ausgeführt wird, analysiert der Befehlsprozessor (CMD.exe) vollständige Zeilen und vollständige zusammengesetzte Befehle . Variablen werden nur einmal durch ihre Werte ersetzt, BEVOR die Befehle der Zeile ausgeführt werden.

Wenn Sie die verzögerte Erweiterung aktivieren :

Die verzögerte Erweiterung bewirkt, dass Variablen in einer Batchdatei zur Ausführungszeit und nicht zur Analysezeit erweitert werden. 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 WMICBefehl schlägt mit dem in der Frage angegebenen Fehler fehl.

Das zweite Mal, wenn Sie die Batchdatei aufrufen, %user%wird definiert (mit dem Wert aus der vorherigen Ausführung und Ihre Batchdatei scheint zu funktionieren.

Beachten Sie, dass Ihre Batch-Datei bei der zweiten Eingabe eines anderen Benutzernamens die falsche SID zurückgibt (dabei wird der Benutzername verwendet, der beim ersten Aufrufen eingegeben wurde).

Sie müssen die folgenden Änderungen vornehmen:

  1. Fügen Sie setlocal enabledelayedexpansionam Anfang der Batch-Datei hinzu.

  2. Ersetzen %util%durch!util!

Geänderte Batch-Datei:

@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

Beispiel Verwendung:

> test
DavidPostill

ntp

Administrator


Type the usernameDavidPostill
DavidPostill
%_sid%=S-1-5-21-1699878757-1063190524-3119395976-1000

Weitere Lektüre

DavidPostill
quelle