2015-09-30 7 views
1

Я пишу сценарий Windows в пакетном режиме. У меня проблема с пробелами в переменных. Когда пользователь вводит пробел, сценарий прерывается.Скрипт Windows не работает, когда пользователь вводит пробелы

Вот часть моего сценария:

:package 
SET /P packageName="Set package name:" 
IF [%packageName%] EQU [] (
    ECHO Empty package name. 
    goto package 
) ELSE (
    set "packageName=%packageName: =%" 
    echo %packageName% 
    pause 
) 
+3

используйте кавычки ('" ') с' if' вместо '[' и, кроме ']' – Stephan

+0

К сожалению, этот sotulion не работает. (Ошибка синтаксиса) – Monika

+0

Не работает? Пожалуйста, опишите подробно, что вы ожидаете, и что вы на самом деле получаете ... – aschipfl

ответ

4

Это schould работа:

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
:package 
SET /P packageName="Set package name:" 
IF "%packageName%"=="" (
    ECHO Empty package name. 
    goto package 
) ELSE (
    set packageName=%packageName: =% 
    echo !packageName! 
    pause 
) 

Есть две модификации вашего сценария:

  • [%packageName%] EQU [] был заменен "%packageName%"==""
  • Я добавил SETLOCAL ENABLEDELAYEDEXPANSION и изменения echo %packageName% с echo !packageName!

Вторая точка, потому что вы меняете значение переменной внутри ПЧ-конструкции. Поскольку интерпретатор не знает, что новое значение будет «компилировать», вам нужно оценить переменную во время выполнения. Вот почему вам нужны SETLOCAL ENABLEDELAYEDEXPANSION и !...! вместо %...%. Это приводит к расширению во время выполнения.

+0

Этот код не будет работать правильно, если пользователь просто набирает одно или несколько пробелов. –

+0

Право. Но это не сработает из-за операции замены. Так что это не было частью вопроса. В этом случае я бы предложил дополнительную проверку IF внутри блока ELSE. – MichaelS

+0

'[% packageName%] EQU []' также верно – Paul

2

Я предлагаю использовать этот код:

@echo off 
setlocal EnableDelayedExpansion 
:package 
rem Predefine variable packageName with a single double quote as value. 
rem This value is kept if the user just hits RETURN or ENTER on prompt. 
rem The single double quote is removed 2 command lines below if the user 
rem does not enter anything or it is overwritten by user entered string. 
set "packageName="" 

set /P "packageName=Set package name: " 

rem Remove double quotes from entered string. This is necessary to 
rem avoid a syntax error on next command line with the IF condition. 
set "packageName=!packageName:"=!" 

if "!packageName!" == "" (
    echo Empty package name. 
    goto package 
) else (
    set "packageName=%packageName: =%" 
    echo Package name with spaces: %packageName% 
    echo Package name without spaces: !packageName! 
    pause 
) 
endlocal 

Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все страницы справок отображаются для каждой команды очень осторожно.

  • if /?
  • set /?
  • setlocal /?

Особенно выход страницы помощи по исполнению if /? должны быть тщательно и полностью прочитан, поскольку это помогает объясняет замедленное расширение, как оно должно быть использовано здесь на примерах ,

Смотрите также выход 2 эхо линии в ELSE ветви в коде выше, чтобы понять, в чем разница между ссылками на переменный знаки процента или с восклицательными знаками в блоках, определенный с ( ... ).

0

Ваш скрипт почти правильно для «переменной поиска/замены», который его позиция должна быть перед «IF»

@echo off 
:package 
set /p packagename="set package name:" 
set packagename=%packagename: =% 
if [%packagename%] equ [] (
echo empty package name &goto package 
) else (echo %packagename%)