2

Я запускаю cmd.exe как администратор и запускаю этот скрипт, при первом запуске я всегда получаю Instances Available , мне нужно выполнить его второй раз (иногда 3-4 раза), чтобы фактически напечатать SID ... почему?

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%

1 ответ1

0

Я должен выполнить это второй раз (иногда 3-4 раза), чтобы фактически напечатать SID

Ваш пакетный файл не использует setlocal или delayedexpansion, поэтому он будет работать, только если %user% определен в среде, которая вызывает пакетный файл.

Из-за отсутствия setlocal переменные, установленные внутри пакетного файла, просочились в вызывающую командную оболочку, и их можно будет использовать при следующем вызове пакетного файла.

Внутри пакетного файла (при первом вызове)% user% не может использоваться внутри пакетного файла, поскольку на него ссылаются внутри блока кода (if):

При выполнении командного файла командный процессор (CMD.exe) будет анализировать полные строки и полные составные команды. Переменные заменяются своими значениями только один раз, ДО выполнения команд строки.

Если вы включите задержку расширения:

Задержка расширения приведет к тому, что переменные в пакетном файле будут расширяться во время выполнения, а не во время анализа, эта опция включается командой SETLOCAL EnableDelayedExpansion.

Поэтому при первом вызове командного файла %user% во время выполнения не определено, и команда WMIC завершается неудачно с ошибкой, отмеченной в вопросе.

Второй раз, когда вы вызываете пакетный файл %user% , определено (со значением из предыдущего выполнения, и ваш пакетный файл, кажется, работает.

Обратите внимание, что если вы введете другое имя пользователя во второй раз, ваш пакетный файл вернет неправильный SID (он будет использовать имя пользователя, введенное при первом вызове).

Вам необходимо внести следующие изменения:

  1. Добавьте setlocal enabledelayedexpansion в начале пакетного файла.

  2. Заменить %util% на !util!

Модифицированный пакетный файл:

@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

Пример использования:

> test
DavidPostill

ntp

Administrator


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

Дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .