Сетевая команда командного файла Windows не устанавливает уровень ошибки

Я пытаюсь определить, работает ли скрипт с правами администратора на Win7, но уровень ошибок, похоже, не устанавливается последовательно после выполнения команды «net» …

Это (упрощенный) мой код:

net session >null 2>$1
if %errorLevel% == 0 (
  echo This seems to be mighty ADMIN...
) else (
  echo Poor sod... no Admin, no glory - errorLevel: %errorLevel%
)

@SETLOCAL
@set TSTHOME=%~dp0
@set TSTNAME=%~n0

set SAL=NO
set SCL=NO
:VAL_PARM
  if .%1 == . @goto :VAL_PARM_END
  if /i %1 == SAL (
    net session >null 2>$1
    if %errorLevel% == 0 (
      set SAL=YES
    ) else (
      echo Option "SAL" requires Administrator priviliges (run "as Admin" or from an elevated command prompt)
      goto :EOF
    )
  ) else (
    if /i %1 == SCL (
      set SCL=YES
    ) else (
      echo off
      echo Invalid argument "%1"; correct syntax: %TSTNAME% [SAL] [SCL]
      echo                        where:   SAL: save agent  logs of each command
      echo                                 SCL: save client logs of each command
      echo                        NOTE: "SAL" requires "Administrator" privileges
      goto :EOF
    )
  )
  shift
  goto :VAL_PARM
:VAL_PARM_END

Но когда я запускаю это из обычной командной строки, это вывод:

C:\MyDir>isAdmin Sal

C:\MyDir>net session 1>null 2>$1

C:\MyDir>if 2 == 0 (эхо Кажется, это могущественный АДМИН... ) else (эхо Бедняга... нет админа, нет славы - errorLevel: 2 )
Бедняга... нет админа , нет славы - errorLevel: 2

C:MyDir>установить SAL=NO

C:\MyDir> установить SCL = НЕТ

C:\MyDir>если .sal == .

C:\MyDir>if /I sal == SAL (
net session 1>null 2>$1
if 0 == 0 (установите SAL=YES )
else (параметр echo "SAL" требует администратора привилегии (запускать «от имени администратора» или из командной строки с повышенными привилегиями )
перейти к :EOF )

Почему, ради бога, вторая «сетевая сессия» не устанавливает errorLevel???


person Juul Vanparijs    schedule 23.11.2014    source источник
comment
возможный дубликат Почему эта пакетная переменная никогда не изменяется, даже когда установить?   -  person Harry Johnston    schedule 24.11.2014


Ответы (1)


Не сравнивайте уровни ошибок таким образом, поскольку переменная будет расширена еще до выполнения блока if и, таким образом, сохранит свое значение до блока. Вместо этого используйте следующее:

if not errorlevel 1 ...

или использовать отложенное расширение. Вы можете прочитать об этом в help set.

person Joey    schedule 23.11.2014
comment
Некоторые разработчики в MS, должно быть, были под кайфом, когда разрабатывали это, но ваш ответ правильный... большое спасибо. - person Juul Vanparijs; 24.11.2014
comment
Я думаю, он был разработан много лет назад и имел некоторые строгие требования совместимости. Также имейте в виду, что командная строка была более или менее гражданином второго сорта в Windows до PowerShell. - person Joey; 24.11.2014