Передача пароля в качестве аргумента команде psql в NSIS

Я пытаюсь передать входной пароль для команды sql в NSIS. Если я запускаю psql в командной строке, это похоже на:

 psql -U postgres -v V1=username -v V2="'dbpassword'" -w -f "path\file.sql"

Файл sql состоит из следующей соответствующей команды:

CREATE USER :V1 WITH PASSWORD :V2 LOGIN NOSUPERUSER IN GROUP postgres;

Как выполнить ту же команду в NSIS, используя переменные? Я попробовал следующее, но это не сработает

nsExec::Exec 'psql -U postgres -v V1=$username -v V2=$dbpassword -w -f "path\file.sql"'

Если я использую "'$dbpassword'" это не скомпилируется.

1 ответ

Решение

У вас есть проблема цитирования: когда вы пытаетесь поставить -v V2="'$dbpassword'" в вашей команде

nsExec::Exec 'psql -U postgres -v V1=$username -v V2=$dbpassword -w -f "path\file.sql"'

В результате получается следующая команда с несовпадением в кавычках:

nsExec::Exec 'psql -U postgres -v V1=$username -v V2="'$dbpassword'" -w -f "path\file.sql"'
             ^                                        ^
              `- Begining of string                    `- End of string

После одинарной кавычки V2строка синтаксически заканчивается, поэтому следующий текст является мусором для компилятора.

Хитрость в том, что NSIS может обрабатывать 3 разных разделителя строк: одинарная кавычка 'двойная кавычка " и обратная цитата `, Попробуйте использовать обратную кавычку, чтобы избежать столкновения одинарной / двойной кавычки в вашей команде:

nsExec::Exec `psql -U postgres -v V1=$username -v V2="'$dbpassword'" -w -f "path\file.sql"`
Другие вопросы по тегам