Как использовать REG_EXPAND_SZ из командной строки? - PullRequest
4 голосов
/ 01 сентября 2010

Я читал документацию командной строки Windows (Win + F1) о командах, которые изменяют реестр Windows, в частности о команде "reg add".

reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d "%systemroot%\system32"

Теперь, я не знаю, как это было разработано, чтобы работать. Когда я вызываю команду выше, переменная %systemroot% расширяется до C:\Windows. Я попытался сделать следующее, чтобы переменная не расширялась, но я никоим образом не мог заставить ее этого не делать:

  • экранирование `%%` 'с помощью `%, ^, \` - не работает, даже если я использую двойные кавычки
  • использование одинарных кавычек '' вокруг всей строки / d
  • использовать `setlocal setdelayedexpansion`? что-то вроде:

# (setlocal enabledelayedexpansion) && (reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d "!systemroot!\system32") && (setlocal disabledelayedexpansion)

Переменная 'data' (/ d) поле либо ^%systemroot^% или !systemroot!, либо просто расширяется до C: \ windows. Я мог бы использовать файл .reg для выполнения своей задачи, но я просто не хочу этого делать.
Я подумал, что, возможно, что-то не так с программой, которую я использую для отображения содержимого переменной (regedit / regedt32 / reg query (commandline)), но после проверки это, вероятно, не так.
Есть идеи? В основном меня интересует, как должно выглядеть значение переменной в окне regedit, если оно должно быть таким: "%systemroot%\system32" или "C:\windows\system32" для правильного расширения другими программами. С уважением.

Ответы [ 9 ]

5 голосов
/ 01 сентября 2010

Из командной строки это сработало для меня:

reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d ^%systemroot^%\system32
3 голосов
/ 02 октября 2011

Синтаксис, предложенный афорией, правильный, без кавычек, как вы обнаружили. Но вы сталкиваетесь с проблемами, когда вам нужны пробелы в значении.

Однако, - это , в котором можно ввести кавычки в значение. Это выглядит странно, но работает:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d ^%SystemRoot^%;c:\<b>Program" Files"</b>\Intel\DMIX;C:\bin /t REG_EXPAND_SZ

Вы можете использовать кавычки там, где это необходимо, но не вокруг переменных. И не сразу после обратной косой черты.

Кроме того, помните, что синтаксис для использования в командном файле отличается от синтаксиса командной строки. Если вы поместите эту строку в командный файл, вам нужно заменить «^» на другой «%»:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d %%SystemRoot%%;c:\Program" Files"\Intel\DMIX;C:\bin /t REG_EXPAND_SZ

(cmd.exe всегда напоминает мне цитату Генри Спенсера «Те, кто не понимает Unix, обречены плохо его изобретать» * )

1 голос
/ 29 декабря 2013

У нас есть использование в autounattend.xml. Сначала я следовал ответу афории, затем мне пришлось использовать расширенный ответ Мивка. У меня было это работает. Затем я внес небольшое изменение, и оно перестало работать. Я считаю, что это понимание стоит сообщить, чтобы спасти других от долгого разочарования.

Основываясь на предыдущих ответах, вот как это сделать в autounattend.xml:

<CommandLine>cmd.exe /c reg.exe add HKLM\ourkey /v ourvalue /t REG_EXPAND_SZ /d "our data with spaces"^%USERNAME^%"and more spaces" /f</CommandLine>

Что имеет значение, так это cmd.exe / c. Если вы не используете cmd.exe, тогда reg.exe все равно запускается, но в регистр вносит буквально ^%, а не нужный%.

Может быть, ответ от ASTX813 сработает, но кажется, что это легче читать.

1 голос
/ 19 марта 2011

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

SET VAR =% SET SET VALUE =% VAR% SystemRoot% VAR% \ system32 ... REG ADD HKLM ... / v Test/ t REG_EXPAND_SZ / d% VALUE%

Я заканчиваю тестом, содержащим строку %SystemRoot%\system32

Редактировать: должен был закончить тестирование перед публикацией.Хотя это работало из командной строки, это не помогло в моих командных сценариях.Какая работа была SET VALUE=%%SystemRoot%%\system32...

0 голосов
/ 17 июля 2018

без кавычек

reg add HKCU\testfolder /v Biedronka /t REG_EXPAND_SZ /d "%%%^%systemroot%%%^%\system32"

с кавычками

reg add HKCU\testfolder /v Biedronka /t REG_EXPAND_SZ /d "\"^%%systemroot^%%\system32\""
0 голосов
/ 01 декабря 2017

Из пакетного файла вы сталкиваетесь с проблемами с кавычками, которые затем можно экранировать обратной косой чертой, например:

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%name%" /v "UninstallString" /t REG_EXPAND_SZ /d "\"%%comspec%%\" /d /c \"%dest%\uninstall.cmd\""
0 голосов
/ 23 января 2017

Пожалуйста, попробуйте следующее:

reg add HKCU \ testfolder / t REG_EXPAND_SZ / v Stokrotka / d ^% systemroot% ^ \ system32

0 голосов
/ 08 июня 2016

Ответ очень прост. Только указывайте пробелы и избегайте%.

В командной строке экранируйте% с помощью ^.

reg add HKLM\Software\Microsoft\Command" "Processor /v AutoRun /t REG_SZ /d title" "^%username^% /f

В пакетном файле экранируйте% с другим%.

reg add HKLM\Software\Microsoft\Command" "Processor /v AutoRun  /t REG_SZ /d title" "%%username%% /f

Мне понадобилось время, чтобы понять. На мой взгляд, я должен заключить в кавычки всю строку, но не смог получить передаваемую переменную без ее расширения. Я сломал свой образ мыслей, цитируя вместо этого пробелы.

0 голосов
/ 05 мая 2015

Здесь нет магии, вы должны экранировать каждый% в командной строке с помощью / становиться: %%.

В командном файле вы снова должны экранировать их, став %%%% SystemRoot %%%%. Да, четыре амперсанда. Это некрасиво, но так оно и есть, и все же оно довольно последовательное.

примечание: использование ^ для выхода из него как буквального символа может помочь / очистить только за один шаг / градус (если это не интерпретируется) Преимущество использования ^ заключается в том, что вы можете писать в командной строке или командном файле с идентичным синтаксисом: например. «^% SytemRoot ^%», поскольку в обеих средах% рассматривается одинаково как буквальный.

...