在请求用户输入时,批处理脚本中出现语法错误(/ P)

时间:2013-05-14 05:05:12

标签: windows batch-file syntax-error wmic

我问过几个人问题是什么,并且在没有解决方案的情况下走了两次。我之前没有玩过批次,所以这可能是一个简单的错误。该代码目前应该使用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

1 个答案:

答案 0 :(得分: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.

但这是一个棘手的事情:它在<{em> 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