2015-07-22 3 views
-1

Ссылка на ss64.com четко указывает, что команда вызова может вызывать внутреннюю команду, тогда как ссылка на команду Windows XP не упоминает все. Даже старая команда MS DOS не упоминает об этом. Это была причина, почему я нашел этот синтаксис в заблуждение:Некоторая путаница в документации команды вызова командного процессора Windows XP

call set X= %X% Это элегантный способ расширения входной переменной среды пользователя по сравнению с использованием возможности синтаксического анализа для команды, чтобы получить развернутое значение переменной окружения , Почему командный процессор должен дважды прочитать входную переменную, чтобы расширить ее? Если ввод введен пользователем напрямую, команда, использующая его, работает без проблем. Для примера. «% userprofile% \ desktop \ file.txt» не имеет проблем для процессора при вводе непосредственно, но когда одна и та же строка вводится через приглашение, система теряется. Если входная переменная не имеет пробелов или специальных символов, ее не нужно называть, ее можно использовать напрямую.

ответ

0

Использование call в указанных сценариях просто принудительно приводит к двойному пропуску парсерного анализатора по команде справа от call. В упрощенной последовательности (here весь процесс)

  • Первый проход будет считывать строку, заменить переменные со значениями внутри них и команда преобразуется в пакетном внутреннее представление. Поскольку команда для выполнения - call, текст (он не был разобран, чтобы быть идентифицированным как команда) после того, как call вставляется в текущий пакетный контекст в качестве новой команды.

  • Теперь, чтобы выполнить вставленную команду, ее необходимо снова проанализировать (второй проход), чтобы сгенерировать внутреннее представление новой команды.

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

1

Вашей Путаница происходит из-за того, что call set X=%X% является заменой set X=!%X%!, не любого for функции. Цель состоит в том, чтобы развернуть значение переменной дважды. Простой пример:

set /P "str=Enter a string: " 
set /P "start=Enter start char: " 
set /P "len=Enter number of chars: " 

echo The substring is: "!str:~%start%,%len%!" 

call echo The substring is: "%%str:~%start%,%len%%%" 

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

То же самое происходит с вашим путем: если прочитанное значение включает любую переменную%%, невозможно получить полный путь, не расширив его дважды!

Ключ здесь состоит в том, что эти значения COMES FROM USER INPUT, отличные от того, помещают ли они в пакетный файл или вводят их в командной строке.

EDIT: Другой пример; выполните его из командной строки:

C:\> set var= 

C:\> set command=echo %var% 

C:\> echo %command% 
echo %var% 

C:\> %command% 
%var% 

C:\> set var=This is var value 

C:\> %command% 
%var% 

C:\> call %command% 
This is var value 
+0

Прежде всего спасибо вам за ваше терпение и помощь. Здесь я и собирался с ним. –

+0

REM пользователь вводит строку, которая показывает полный путь к его файлу, где он хочет, чтобы система выполняла операции REM, чтобы дать результат/результаты, которые он ищет. В этом случае он стремится узнать количество строк/строк в выбранном тексте файл. REM Мы начинаем с просьбы ввести строку в командной строке. 'set/p X = введите имя вашего текстового файла, присоединенного к его полному пути. Как например. если файл находится на вашем рабочем столе. Введите «C: \ Documents and Settings \ Your name \ Desktop \ file.txt» ' –

+0

REM Теперь жизнь была бы легкой, если бы он напечатал именно это. Но что, если он должен был набрать «% userprofile% \ desktop \ file.txt»? Мы должны учитывать его любовь к особым персонажам, или наша партия разочарует его. REM Вот как. Когда он вводит свою строку со своим синтаксисом, ее нужно развернуть до формы, которую я привел в качестве примера, чтобы она успешно использовалась в последующих командах. REM Трюк заключается в том, что он записывает свой вход с консоли в расширенной форме в varayable. Мы используем следующее для того же –

Смежные вопросы