其他命令一次批量运行?

时间:2013-05-15 23:39:16

标签: if-statement batch-file wmic

我不确定为什么会发生这种情况,但似乎我正在处理的这个批处理脚本中的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

3 个答案:

答案 0 :(得分:2)

我不确定你的意思“看起来我正在处理的这个批处理脚本中的else命令是一次运行,而不是一次运行一行。”

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

解析语句时会发生使用%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 SETSET /?,然后开始阅读与开始的段落相同的一半。最后,支持延迟环境变量扩展已添加。“

答案 1 :(得分:1)

它认为问题是密码变量中的简单错字。输入时。使用的变量名称为remotepassword,在wmic命令中使用时,使用的名称为remotepass,因此它始终为空白:

set /P remotepassword=
rem    ^^^^^^^^^^^^^^
wmic /node:%remotemachine% /user:%remoteuser% /password:%remotepass% process get name,processid
rem                                                      ^^^^^^^^^^

答案 2 :(得分:1)

iffor代码块中,您需要延迟展开,并为所有变量值的变量!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
)