Всякий раз, когда пользователь пакетного файла запрашивается строка с помощью set /P
пользователя имеет свободу
- не вводить вообще ничего, нажав просто только RETURN или ENTER, что приводит к окружающей среде переменная по-прежнему не определена после запроса, если она не была определена ранее, или переменная сохраняет свое текущее значение, если оно уже было определено ранее, или
- введите действительно что угодно, включая строку, которая может привести к завершению пакетного выполнения из-за синтаксическая ошибка повторно в пакетном коде позже или нежелательное поведение.
Давайте посмотрим на линии
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%
.
Можете ли вы опубликовать полный код? – Hackoo
Простейший способ отладки командного файла - запустить его из командной строки вместо того, чтобы запускать его с помощью мыши. Также убедитесь, что вы не подавляете подробный вывод с помощью команды echo off. – Squashman
Чтобы отладить пакетный файл, удалите «echo off», если он присутствует в пакетном файле, или измените его на «echo on» или закомментируйте «echo off», откройте окно командной строки, введите имя командного файла с расширением файла и полным путем заключен в двойные кавычки и запускает командный файл. Теперь можно увидеть, какие командные строки выполняются после предварительной обработки и где пакетный файл выходит в случае ошибки. Двойной щелчок на пакетном файле не подходит для тестирования командного файла, поскольку процесс команды всегда автоматически закрывается, поэтому сообщения об ошибках не отображаются. – Mofi