0

您好我正在尝试创建一个批处理文件以从记事本文件中的服务器列表中过滤掉具有 RDP/ICA 侦听器的服务器,我使用以下语法创建了这个脚本,但由于某些原因它不能作为预计,有人可以帮我解决这个问题吗?

我在 computer.txt 文件中有一个服务器列表,我正在尝试查找已关闭的服务器,如果 errorlevel 为 0,表示找到了字符串 down,我希望将服务器名称打印在 listenerdown.txt 中,但由于某些原因,如果我执行批处理文件,computer.txt 中的所有服务器都会写入 listenerdown.txt 文件

下面是批处理文件

for /f %%i in (computer.txt) do(
qwinsta /server:%%i | findstr/i down >nul 2>&1
if %errorlevel% neq 1
echo %%i >>Listenerdown.txt
)
4

2 回答 2

0

echo移到与语句相同的行,if否则使用括号建立范围,%ErrorLevel% 将始终为 0,因为变量不会在没有延迟扩展的情况下在循环中设置。

setlocal EnableDelayedExpansion
for /f %%i in (computer.txt) do(
    qwinsta /server:%%i | findstr /i down >nul 2>&1
    if !errorlevel! neq 1 echo %%i>>Listenerdown.txt
)
endlocal

或者

setlocal EnableDelayedExpansion
for /f %%i in (computer.txt) do(
    qwinsta /server:%%i | findstr /i down >nul 2>&1
    if !errorlevel! neq 1 (
        echo %%i>>Listenerdown.txt
    )
)
endlocal

Cmd.exe 逐行解析批处理文件,除非您告诉它该命令的范围继续到下一行,否则它会认为该命令已完成。

于 2013-01-21T21:23:54.627 回答
0

您应该使用setlocal EnableDelayedExpansion, 而!errorlevel!不是%errorlevel%

@echo off
setlocal EnableDelayedExpansion

for /f %%i in (computer.txt) do (
qwinsta /server:%%i | findstr/i down >nul 2>&1
if !errorlevel! neq 1 echo %%i >>Listenerdown.txt
)

否则 errorlevel 的值在进入循环之前只会被扩展一次,并且不会有正确的值。您还必须确保它echoif.

于 2013-01-21T21:26:45.480 回答