2013-05-15 1 views
0

Я не уверен, почему это происходит, но похоже, что команда else в этом пакетном скрипте, над которым я работаю, работает одновременно, а не по одной строке за раз. Какие-либо предложения?Else command в пакетном запуске все сразу?

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

Предполагаю, что вы имели в виду первое в командном файле? Что именно вы имеете в виду, команда else работает сразу? Вы имеете в виду, что он никогда не перестает позволять вам вводить что-либо для двух команд 'set/P'? Вы должны более четко описать, что происходит (и то, что вы ожидаете). –

+0

Я получаю «Недопустимый идентификатор пользователя», который, как я полагаю, является из других вводимых команд. Когда я вхожу в 'remoteuser', он не отображается в следующей строке. Этот пользователь действительно существует, и команда отлично работает с этим пользователем и паролем, когда он выходит из партии. – EpicCyndaquil

ответ

2

Я не уверен, что вы подразумеваете под «кажется, что команда еще в этом пакетном сценарии я работаю работаю сразу, вместо одной строки за один раз.»

Но у вас есть проблема с первым блоком ELSE.

Нормальное расширение с использованием %var% возникает, когда оператор анализируется, и вся ваша конструкция IF/ELSE анализируется сразу. Таким образом, ваш блок ELSE видит значения %remoteuser% и %remotepass%, существовавшие до выполнения операторов SET/P, которые устанавливают значения. Очевидно, не то, что вы хотите.

Проблема легко решена с помощью отложенного расширения. Отсроченное расширение должно быть сначала разрешено с помощью SETLOCAL EnableDelayedExpansion, затем вы разворачиваете переменные во время выполнения, используя !var! вместо %var%.

Вы также должны соответствовать вашим именам переменных, как указал Майкл Берр в своем ответе.

Я не проверял, но я считаю, что следующее будет работать:

@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 /? из командной строки и начал читать о полпути вниз с абзацем начинается «Наконец, добавлена ​​поддержка расширенного расширения переменных среды».

+0

Благодарим вас за подробный ответ. Ваш код действительно работает, и я обязательно буду использовать отложенное расширение с этого момента (когда это необходимо). – EpicCyndaquil

1

Он считает, что проблема заключается в простой опечатке в переменной пароля. При вводе. имя переменной используется remotepassword, при использовании в команде wmic имя используется remotepass поэтому он всегда будет пустым:

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

Это была проблема, но не единственная проблема. Спасибо за ваш вклад. – EpicCyndaquil

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 
) 
Смежные вопросы