我不确定为什么会发生这种情况,但似乎我正在处理的这个批处理脚本中的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
答案 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 SET
或SET /?
,然后开始阅读与开始的段落相同的一半。最后,支持延迟环境变量扩展已添加。“
答案 1 :(得分:1)
它认为问题是密码变量中的简单错字。输入时。使用的变量名称为remotepassword
,在wmic
命令中使用时,使用的名称为remotepass
,因此它始终为空白:
set /P remotepassword=
rem ^^^^^^^^^^^^^^
wmic /node:%remotemachine% /user:%remoteuser% /password:%remotepass% process get name,processid
rem ^^^^^^^^^^
答案 2 :(得分:1)
在if
或for
代码块中,您需要延迟展开,并为所有变量值的变量!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
)