Я должен выполнить это второй раз (иногда 3-4 раза), чтобы фактически напечатать SID
Ваш пакетный файл не использует setlocal или delayedexpansion, поэтому он будет работать, только если %user%
определен в среде, которая вызывает пакетный файл.
Из-за отсутствия setlocal
переменные, установленные внутри пакетного файла, просочились в вызывающую командную оболочку, и их можно будет использовать при следующем вызове пакетного файла.
Внутри пакетного файла (при первом вызове)% user% не может использоваться внутри пакетного файла, поскольку на него ссылаются внутри блока кода (if
):
При выполнении командного файла командный процессор (CMD.exe) будет анализировать полные строки и полные составные команды. Переменные заменяются своими значениями только один раз, ДО выполнения команд строки.
Если вы включите задержку расширения:
Задержка расширения приведет к тому, что переменные в пакетном файле будут расширяться во время выполнения, а не во время анализа, эта опция включается командой SETLOCAL EnableDelayedExpansion.
Поэтому при первом вызове командного файла %user%
во время выполнения не определено, и команда WMIC
завершается неудачно с ошибкой, отмеченной в вопросе.
Второй раз, когда вы вызываете пакетный файл %user%
, определено (со значением из предыдущего выполнения, и ваш пакетный файл, кажется, работает.
Обратите внимание, что если вы введете другое имя пользователя во второй раз, ваш пакетный файл вернет неправильный SID (он будет использовать имя пользователя, введенное при первом вызове).
Вам необходимо внести следующие изменения:
Добавьте setlocal enabledelayedexpansion
в начале пакетного файла.
Заменить %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
Дальнейшее чтение