1

我问了几个人问题是什么,并且两次没有解决方案就走了。我以前没有太多玩过批处理,所以这可能是一个简单的错误。该代码目前应该给出使用 wmic 的进程列表。最后,我想设置它来杀死进程(我应该可以很容易地做到这一点),但我必须首先克服这个障碍。

@echo off
set getprocesslistlocal=wmic process get name,processid
set /P remotemachinecheck=Type the name of the remote machine to view processes of (or type local for local machine), and press Enter.
if %remotemachinecheck%==local
(
%getprocesslistlocal%
) else (
set remotemachine=%remotemachinecheck%
set /P remoteuser=Type the user name to access %remotemachine% with, then press Enter.
set /P remotepassword=[Type the password for %remoteuser% on %remotemachine%, then press Enter. Watch your back, it won't be hidden!
set getprocesslistremote=wmic /node %remotemachine% /user:%remoteuser% /password:%remotepass% process get name,processid
%getprocesslistremote%
)
echo End of list. Press any key to choose process to kill.
@echo off
pause>null
4

1 回答 1

0

您要做的第一件事是注释掉@echo off(或将其更改为@echo on),以便您可以准确地看到导致错误的行。


您应该注意的第二件事是命令在执行之前被处理以进行替换,而不是行。

这意味着整个结构将在设置变量之前对其if ( ) else ( )进行替换,这意味着当您想使用它时,它不会被设置为您想要的。remotemachine

例如,这段代码:

@echo off
set xyzzy=plugh
if a==a (
    set xyzzy=twisty
    echo %xyzzy%
)

不会像你想象的那样输出twisty,而是给你plugh.

您需要查看延迟扩展和!!扩展运算符:

@setlocal enableextensions enabledelayedexpansion
@echo off
set xyzzy=plugh
if a==a (
    set xyzzy=twisty
    echo !xyzzy!
)
endlocal

第三件事,我怀疑这是导致您的直接问题的原因,将 移到行(if

if %remotemachinecheck%==local (

使用(以下行,它会生成如下错误:

The syntax of the command is incorrect.

但这是一个棘手的事情:它在行之前if输出,这可能会让您相信错误在前一行,根据以下记录(缩进计算机生成的行):

c:\pax> type qq1.cmd
    set q=w
    if a==a
    (
        echo yes
    )

c:\pax> qq1

    c>\pax> set q=w
    The syntax of the command is incorrect.

    c:\pax> if a==a

c:\pax> type qq2.cmd
    set q=w
    if a==a (
        echo yes
    )

c:\pax> qq2

    c>\pax> set q=w

    c:\pax> if a==a (echo equal )
    equal
于 2013-05-14T05:14:56.657 回答