0

我不确定为什么会发生这种情况,但似乎我正在处理的这个批处理脚本中的 else 命令是一次性运行的,而不是一次运行一行。有什么建议么?

set getprocesslistlocal=wmic process get name,processid,workingsetsize
echo Type the name of the remote machine to view processes of (or type local for local machine), and press Enter.
set /P remotemachine=
if %remotemachine%==local (
%getprocesslistlocal%
) else (
echo Type the user name to access %remotemachine% with, then press Enter.
set /P remoteuser=
echo Type the password for %remoteuser% on %remotemachine%, then press Enter. ^(Will be displayed in plaintext^)
set /P remotepassword=
wmic /node:%remotemachine% /user:%remoteuser% /password:%remotepass% process get name,processid
)
echo End of list.
pause
echo Type the process id to terminate and hit Enter.
set /P killid=
if %remotemachine%==local (
wmic process where processid="%killid%" call terminate
) else (
wmic /node %remotemachine% /user:%remoteuser% /password:%remotepass% process where processid="%killid%" call terminate
)
echo Process id %killid% terminated.
pause
4

3 回答 3

2

我不确定您所说的“我正在处理的这个批处理脚本中的 else 命令似乎是同时运行的,而不是一次运行一行”。

但是你的第一个 ELSE 块确实有问题。

解析语句时会发生正常扩展 using %var%,并且您的整个 IF/ELSE 构造会被一次性解析。因此,您的 ELSE 块正在查看在执行设置值的 SET /P 语句之前存在的%remoteuser%和的值。%remotepass%显然不是你想要的。

使用延迟扩展很容易解决这个问题。必须首先使用 SETLOCAL EnableDelayedExpansion 启用延迟扩展,然后在执行时使用!var!而不是扩展变量%var%

正如 Michael Burr 在他的回答中指出的那样,您还必须与变量名称保持一致。

我没有测试过,但我相信以下方法会起作用:

@echo off
setlocal enableDelayedExpansion
set getprocesslistlocal=wmic process get name,processid,workingsetsize
echo Type the name of the remote machine to view processes of (or type local for local machine), and press Enter.
set /P remotemachine=
if %remotemachine%==local (
  %getprocesslistlocal%
) else (
  echo Type the user name to access %remotemachine% with, then press Enter.
  set /P remoteuser=
  echo Type the password for !remoteuser! on %remotemachine%, then press Enter. ^(Will be displayed in plaintext^)
  set /P remotepass=
  wmic /node:%remotemachine% /user:!remoteuser! /password:!remotepass! process get name,processid
)
echo End of list.
pause
echo Type the process id to terminate and hit Enter.
set /P killid=
if %remotemachine%==local (
  wmic process where processid="%killid%" call terminate
) else (
  wmic /node %remotemachine% /user:%remoteuser% /password:%remotepass% process where processid="%killid%" call terminate
)
echo Process id %killid% terminated.
pause

有关延迟扩展的更多信息,请在命令提示符下键入HELP SET或开始阅读,从“最后,添加了对延迟环境变量扩展的支持”开始的段落开始阅读。SET /?

于 2013-05-16T00:27:31.613 回答
1

它认为问题是密码变量中的一个简单的错字。输入时。使用的变量名称是remotepassword,当在wmic命令中使用时,使用的名称是remotepass所以它总是空白的:

set /P remotepassword=
rem    ^^^^^^^^^^^^^^
wmic /node:%remotemachine% /user:%remoteuser% /password:%remotepass% process get name,processid
rem                                                      ^^^^^^^^^^
于 2013-05-16T00:18:09.893 回答
1

在 a if orfor代码块内,您需要延迟扩展以及!variables! 所有具有变化值的变量。例子:

setlocal enabledelayedexpansion
...
) else (
echo Type the user name to access %remotemachine% with, then press Enter.
set /P remoteuser=
echo Type the password for !remoteuser! on %remotemachine%, then press Enter. ^(Will be displayed in plaintext^)
set /P remotepassword=
wmic /node:%remotemachine% /user:!remoteuser! /password:!remotepass! process get name,processid
)
于 2013-05-16T00:27:12.370 回答