Windows 批处理文件 net 命令未设置错误级别

Posted

技术标签:

【中文标题】Windows 批处理文件 net 命令未设置错误级别【英文标题】:Windows batch file net command not setting errorlevel 【发布时间】:2015-01-21 13:23:33 【问题描述】:

我正在尝试确定脚本是否在 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 (echo 这似乎是强大的管理员...) else (echo 可怜的草皮...没有管理员,没有荣耀 - errorLevel: 2) 可怜的草皮......没有管理员,没有荣耀 - 错误级别:2

C:MyDir>设置 SAL=NO

C:\MyDir>设置 SCL=NO

C:\MyDir>如果 .sal == .

C:\MyDir>如果 /I sal == SAL ( 净会话 1>null 2>$1 if 0 == 0 (set SAL=YES) else(回显选项“SAL”需要管理员权限(“以管理员身份”运行或从提升的命令提示符运行) 转到:EOF )

为什么第二个“网络会话”没有设置errorLevel???

【问题讨论】:

Why does this batch variable never change even when set? 的可能重复项 【参考方案1】:

不要像那样比较错误级别,因为变量会在之前被扩展,if 块甚至会执行并因此保留其在块之前的值。请改用以下内容:

if not errorlevel 1 ...

或使用延迟扩展。您可以在help set 中阅读相关内容。

【讨论】:

MS 的一些开发人员在设计这个时一定很兴奋,但你的回答是正确的......非常感谢 我猜它是很久以前设计的并且有一些严格的兼容性要求。还要记住,在 PowerShell 之前,命令行在 Windows 上或多或少是二等公民。

以上是关于Windows 批处理文件 net 命令未设置错误级别的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core App - 命令行格式异常

Discord.NET '对象引用未设置为对象的实例。 C# [重复]

Websocket Autobahn Testsuite 未处理错误(Windows 和 Ubuntu)

错误“致命错误 C1034:windows.h:未设置包含路径”

.NET WebService Studio 引用WSDL文件报错。错误信息问题补充中贴上

批处理文件中的 Powershell:错误和命令未执行