3

Я работаю с пакетным скриптом, которому нужны права администратора, и я позаимствовал некоторый код get-admin-rights из сети. Я пытаюсь выяснить, что делает последняя часть определенной строки:

set params = %*:"=""

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

set params = %*

Но что это делает?

:"=""

1 ответ1

5

Предполагая, что вы скопировали код правильно - он вообще ничего особенного не делает. Литерал :"="" просто добавляется к расширенной строке аргумента.

Если бы у вас было %*:"=""% (обратите внимание на дополнительный процент), то это расширило бы переменную среды с именем * , подставив две кавычки для каждой.

Функция расширения Find/Replace доступна только для расширения переменных, но не для расширения аргументов.

Готов поспорить, что это ошибка, внесенная кем-то, у кого очень мало опыта работы с языком пакетной обработки.

Существует почти наверняка еще одна ошибка - все пробелы в назначении являются значительными. Таким образом, создается переменная с именем "params " (без кавычек обратите внимание на конечный пробел). Также значение будет иметь начальный пробел. Я уверен, что ни одно пространство не требуется.

Обновленный, более полный ответ

Теперь, когда мы знаем источник кода, можно дать более полную картину того, что происходит. Необходим больше контекста кода.

Оригинальные соответствующие строки:

set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

Оригинальный пакетный скрипт требовал, чтобы он выполнялся с повышенными правами администратора. Сценарий смог определить, были ли доступны привилегии администратора, а если нет, то создал временный сценарий VBS, который при запуске создаст новый сеанс cmd.exe с привилегиями администратора и повторно запустит исходный пакетный сценарий с теми же исходными аргументами. , Команда для повторного запуска сценария встроена в строку VBS, и строка может содержать аргументы в кавычках. VBS требует, чтобы литералы в кавычках внутри строки экранировались путем удвоения их.

Первоначальный ответ не сохранил аргументы и не имел никакой переменной params . Год спустя ОП попытался расширить ответ, чтобы поддержать сохранение вызывающих аргументов. К сожалению, модифицированный код никогда не был должным образом протестирован, и "улучшение" было серьезно прослушано. Если вы посмотрите на множество комментариев к этому ответу, вы увидите много отчетов о том, что сохранение аргумента все еще не работает.

Во-первых, код определяет переменную с именем "params" (с завершающим пробелом), а затем пытается использовать неопределенную переменную с именем "params" (без конечного пробела). Это явно не может работать. Но простое удаление пробелов из определения ничего не решает.

set params=%*:"=""

ОП должен был подумать, что синтаксис расширится до исходной строки аргумента, а все кавычки будут удвоены. Но поиск / замена работает только при расширении переменных, а не аргументов.

Предположим, что исходный пакетный скрипт - c:\test\test.bat , и он вызывается с помощью

test arg1 "arg 2" "arg 3"

"Исправленная" строка set params=%*:"="" просто получает копию аргументов с %* , а затем добавляет строку :"="" . Таким образом, когда завершено, переменная определяется следующим образом:

params=arg1 "arg 2" "arg 3":"=""

Но ОП на самом деле хотел:

params=arg1 ""arg 2"" ""arg 3""

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

echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 "arg 2" "arg 3":"=""", "", "runas", 1 >> "someTempPath\getadmin.vbs"

Вот код, который должен был быть написан:
РЕДАКТИРОВАТЬ 2018-9-23: добавлено пространство для назначения параметров, чтобы убедиться, что оно всегда определено, даже если нет аргументов

set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"

Первая строка просто определяет параметры как

params= arg1 "arg 2" "arg 3"

И следующая строка использует синтаксис :"="" чтобы удвоить все кавычки при расширении переменной params:

echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat""  arg1 ""arg 2"" ""arg 3""", "", "runas", 1 >> "someTempPath\getadmin.vbs"

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

Я отредактировал оригинальный ответ, чтобы включить исправления ошибок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .