Войти

Показать полную графическую версию : [решено] Выполнение комманд из реестра?


semiono
15-02-2014, 19:18
Пример.
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\RunOnce"; ValueType: string; ValueName: "reg.exe"; ValueData: "cmd.exe /c reg copy HKLM\Software\$$ HKCU /s /f &xcopy {win}\$\AppData {reg:HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList,ProfilesDirectory}\{username}\AppData /eciqhry &xcopy {win}\$\ProgramData {commonappdata} /eciqhry"; Flags: noerror; Permissions: everyone-full
Вопрос в следущем, раньше у меня была строка "RunOnce" = "reg copy HKLM\Software\$$ HKCU" и это работало, но потом я добавил &xcopy и что-то не стало выполняться.
Вобщем я пришёл к выводу, что лучше запускать всю строку под управлением cmd.exe /c Однако, хотелось бы знать как правильно и почему,
мне кажется этот вопрос касается ShellExecute, в том плане, что в cmd/bat возможно другие правила,
а в работе в открытом cmd.exe другие правила, поэтому хочется выяснить, чтобы не делать ошибок.
:)

Iska
15-02-2014, 19:33
Пример. »
Откуда пример? InnoSetup?!

Переведите на русский.

semiono
15-02-2014, 21:29
Откуда пример? InnoSetup?! »
InnoSetup, пример мой,
Переведите на русский. »
там ведь всё понятно..

[HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce]
"reg.exe"="cmd.exe /c reg copy HKLM\Software\$$ HKCU /s /f &xcopy D:\App C:\Users\Administrator\AppData /eciqhry &xcopy D:\Pro C:\ProgramData /eciqhry

Меня волнует только, почему xcopy без cmd.exe /c не работает из "пуск выполнить", что то же самое из RunOnce насколько я понимаю.
Хотя понятно, на то он и команд процессор, чтобы командовать

:)

Может быть дело даже не в xcopy, а в связке &амперсендов которым нужен cmd.exe?
Вобщем ликбез)

Iska
15-02-2014, 21:43
Что такое «$$», «$»?

но потом я добавил &xcopy и что-то не стало выполняться. »
Естественно. Поскольку «&» — прерогатива исключительно командного процессора.

мне кажется этот вопрос касается ShellExecute, в том плане, что в cmd/bat возможно другие правила, »
«ShellExecute» тут совершенно не при чём.

В общем и целом: то, что есть команда, должно быть заключено в кавычки:
{%COMSPEC} /c"reg copy HKLM\Software\$$ HKCU /s /f &xcopy {win}\$\AppData {reg:HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList,ProfilesDirectory}\{username}\AppData /eciqhry &xcopy {win}\$\ProgramData {commonappdata} /eciqhry"
Заработает ли это — смотрите, проверяйте сами.

Чтобы указать в одной строке несколько команд, следует разделить их
символами '&&' и заключить в кавычки. Кроме того, из соображений
совместимости, /X означает то же, что и /E:ON, /Y то же, что и /E:OFF
и /R то же, что и /C. Все прочие ключи командной строки игнорируются.

Если указаны ключи /C или /K, то остальная часть командной строки после
такого ключа обрабатывается как командная строка, а обработка символов
кавычек (") ведется по следующим правилам:

1. Если выполняются все перечисленные ниже условия, то символы
кавычек в командной строке сохраняются:

- ключ /S отсутствует
- есть ровно два символа кавычек
- между ними нет других специальных символов, как то: &<>()@^|
- между ними имеются один или несколько пробелов
- строка, заключенная в кавычки, является именем исполнимого
файла.

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

semiono
16-02-2014, 16:01
Естественно. Поскольку «&» — прерогатива исключительно командного процессора. »
Теперь понятно.
Что такое «$$», «$»? »
Это я так папки называю.
«ShellExecute» тут совершенно не при чём. »
Здесь я имею ввиду, что есть разница выполнение команд в cmd или из проводника, но из вопроса об амперсенд стало понятно почему)
{%COMSPEC} /c »
Интересно. Обычно я избегаю лишний раз квотировать, хотя себе же хуже)

Всётаки у меня не получилось! Либо xcopy не копирует скрытые файлы, либо тут дело в другом, может быть что-то ещё.
Вот такой набор ключей использовал /eciqhry, хотя /s - системные я позабыл, может быть в этом причина.
Вобщем я хотел скопировать в папки Administrator\AppData\Local и Administrator\AppData\Roaming свои папки с контентом
из раздела реестра RunOnce через cmd /c, очевидно что не скопировались папки в скрытые директории, другие, например,
скопировались. Видимо надо было /s добавить.

Профиль Administrator со всеми нужными подпапками ведь должен существовать когда RunOnce выполняется..
Вход в систему тоже под Администратором разумеется, поэтому тут права роль не играют.

Iska
16-02-2014, 19:05
Что такое «$$», «$»? »Это я так папки называю. »
Ясно.

Здесь я имею ввиду, что есть разница выполнение команд в cmd или из проводника, но из вопроса об амперсенд стало понятно почему) »
Говоря о «ShellExecute» обычно подразумевается запуск ассоциированного с типом файла приложения.




© OSzone.net 2001-2012