2016-11-26 17 views
1

Я хотел сделать основной текстовый редактор в пакетном режиме, и я использую set/p для ввода пользователя и записи его в файл.set/p с пробелами в переменном значении

Когда я набираю что-то вроде «привет» или «привет», он отлично работает, но как только я пишу что-то с пробелом и другим символом после, как «мир привет», окно закрывается.

Мой код был:

set /p append=Write what you want to append: 

Тогда я попробовал:

set /p "append=Write what you want to append: " 

, который я нашел в Интернете, но это не сработало.

пауза не помогает, так как программа срабатывает, как только я нажимаю кнопку ввода.

Помощь!

Вот полный код:

:append 
set /p "append=Write what you want to append: " 
if %append%==return (
    cls 
    goto start 
) 
echo %append% >> %filename% 
goto append 

:override 
cls 
echo Name: %filename% 
set /p override="Write new content: " 
echo %override% > %filename% 
pause 
cls 
goto start 

:writefile 
echo. 
set /p filename=Write file name.extension: 
choice /c AO /m "Append to file or override? " 
if %ERRORLEVEL%==1 (
    cls 
    echo Name: %filename% 
    goto append 
) else (
    goto override 
) 
+0

Можете ли вы опубликовать полный код? – Hackoo

+0

Простейший способ отладки командного файла - запустить его из командной строки вместо того, чтобы запускать его с помощью мыши. Также убедитесь, что вы не подавляете подробный вывод с помощью команды echo off. – Squashman

+0

Чтобы отладить пакетный файл, удалите «echo off», если он присутствует в пакетном файле, или измените его на «echo on» или закомментируйте «echo off», откройте окно командной строки, введите имя командного файла с расширением файла и полным путем заключен в двойные кавычки и запускает командный файл. Теперь можно увидеть, какие командные строки выполняются после предварительной обработки и где пакетный файл выходит в случае ошибки. Двойной щелчок на пакетном файле не подходит для тестирования командного файла, поскольку процесс команды всегда автоматически закрывается, поэтому сообщения об ошибках не отображаются. – Mofi

ответ

1

Всякий раз, когда пользователь пакетного файла запрашивается строка с помощью set /P пользователя имеет свободу

  1. не вводить вообще ничего, нажав просто только RETURN или ENTER, что приводит к окружающей среде переменная по-прежнему не определена после запроса, если она не была определена ранее, или переменная сохраняет свое текущее значение, если оно уже было определено ранее, или
  2. введите действительно что угодно, включая строку, которая может привести к завершению пакетного выполнения из-за синтаксическая ошибка повторно в пакетном коде позже или нежелательное поведение.

Давайте посмотрим на линии

if %append%==return (

Если переменная среды не определена перед значением по умолчанию, и пакетный пользователь не входит ничего, эта линия расширяется во время предварительной обработки шаг:

if ==return (

Эта командная строка, конечно, недействительна и приводит к завершению пакетной обработки из-за синтаксической ошибки.

Теперь давайте предположим, что пользователь вводит строку:

I want to append this string. 

Тогда IF командной строки расширяется:

if I want to append this string.==return (

И конечно же эта командная строка недействительна.

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

if "%append%"=="return" (

Но разве это действительно решить все возможные проблемы?

Действительно ли этот код действительно безопасен для любого пользовательского ввода.

Давайте посмотрим, что произойдет, если пользователь вводит строку:

" is a double quote. It should be used around paths like "%ProgramFiles(x86)%". 

IF командной строки расширяющийся теперь:

if "" is a double quote. It should be used around paths like "%ProgramFiles(x86)%""=="return" (

И эта командная строка снова недействителен и приводит выход из командного файла из-за синтаксической ошибки.

Итак, как сделать пакетный код безопасным с любого входа пользователя?

Решение использует расширенное изменение переменной среды везде, где указана введенная пользователем строка.

Пример:

@echo off 
setlocal EnableDelayedExpansion 
echo. 
echo Enter EXIT to exit this batch script. 

:PromptUser 
echo. 
set "UserInput=Nothing^!" 
set /P "UserInput=Please enter a string: " 
if /I "!UserInput!" == "exit" goto EndBatch 
echo You entered: !UserInput! 
goto PromptUser 

:EndBatch 
echo. 
echo Thanks for running this example batch code. 
echo. 
echo The batch file ends in 3 seconds ... 
endlocal 
%SystemRoot%\System32\ping.exe localhost -n 4 >nul 

Используя замедленное расширение строки вводится пользователь, не может привести к недопустимой или неожиданной командной строке в пожилом коде. Это также важно для командной строки

echo !append!>>%filename% 

Важно иметь не символ пробела не остался >> этот пробел также записываются в файл в качестве заднего пространства.

Но задержка расширения также имеет важное значение здесь, в случае пользователь вводит, например, просто 2, который приведет с echo %append%>>%filename% в

echo 2>>%filename% 

, который не добавляет символ 2 к файлу, но будет добавлять STDERR к файлу, который приводит к пустой строке, записанной в файл.

отложенное расширение также необходим для этой строки, введенной пользователем:

(Var1 > 0x2F) && (Var1 < 0x3A) 

, которые должны быть написаны с ECHO в файл, как вошел и не то, что интерпретатор команд Windows, будет производить после расширения исходной строки используя echo %append%>>%filename%.

1

Измените set, чтобы поставить кавычки в нужном месте вокруг строки приглашения, и ваша if линии поставить кавычки вокруг строки испытывается.

set /p append="Write what you want: " 
set append 
echo xx%append%yy 
if "%append%"=="return" (
    echo Yes! 
) 
+0

Это не сработало, все равно происходит сбой, как только я нажимаю Enter – Nihil

+0

@Nihil Обновлено, потому что 'if' также нуждается в котировках. – ClickRick

+0

Теперь это работает, спасибо! – Nihil

1

Ваша проблема с

if %append%==return (

который даст синтаксическую ошибку, если append содержит пробелы. не

использование

if "%append%"=="return" (

"со ссылкой на строку" делает cmd интерпретировать его как единый элемент так необходимый синтаксис if,

if string==string (

больше не нарушаются.