Как запустить и запустить команду - PullRequest
0 голосов
/ 24 октября 2019

Это должно быть легко, но я не могу заставить его работать.

Когда я запускаю следующую команду внутри cmd, она прекрасно работает. Когда я запускаю команду внутри кода c#, она ничего не делает (исключение также не выдается).

Вот команда, которую я использую (которая отлично работает при непосредственном использовании наcmd.exe):

cd %ProgramFiles%\PostgreSQL\12\bin && SET PGPASSWORD=mypassword&& pg_restore.exe -U username -d dbname C:\file\to\dump\my.dump

Вот что я пытаюсь сделать в c# (не работает):

var arg = @"cd %ProgramFiles%\PostgreSQL\12\bin && SET PGPASSWORD=mypassword&& pg_restore.exe -U username -d dbname C:\file\to\dump\my.dump";
Process.Start("cmd.exe", arg);

Я что-то упустил? Я нашел много сообщений о c# запуске процесса, но ничего не решило мою проблему. Я также пытался запустить процесс с StartInfo и добавил свойства, такие как Arguments, FileName и т. Д., Но он также не работал.

Помните, вопрос процесса. Аргументы start () не совпадают - в моем случае я не могу установить system variable (SET PGPASSWORD), поскольку pg_restore не имеет аргумента пароля.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

cmd - это просто консоль, она не нужна для запуска другого процесса.

Приложение, которое вы хотите запустить - pg_restore.exe в папке %ProgramFiles%\PostgreSQL\12\bin. Вы можете передать переменные среды через ProcessStartInfo.EnvironmentVariables словарь. Я не уверен, что конструктор ProcessStartInfo расширяет переменные среды. Вы можете использовать Environment.ExpandEnvironmentVariables , чтобы убедиться, что путь правильный:

var binFolder=@"%ProgramFiles%\PostgreSQL\12\bin\";
var fullPath=Path.Combine(binFolder,"pg_restore.exe");
var arguments=@"-U username -d dbname C:\file\to\dump\my.dump";

var fullPath=Environment.ExpandEnvironmentVariables(pathToRestore);
var startInfo=new ProcessStartInfo(fullPath,arguments) {
       UseShellExecute =false,
       //Need this to read the output if needed
       RedirectStandardOutput = true;
       //Set if needed
       WorkingDirectory = binFolder
};
startInfo.EnvironmentVariables["PGPASSWORD"]=password;

var process=Process.Start(startInfo);

Console.WriteLine(process.StandardOutput.ReadToEnd());
0 голосов
/ 24 октября 2019

Вам необходимо добавить префикс строки аргумента к /c, чтобы cmd знал, что вы говорите ему, что делать:

var arg = @"/c cd %ProgramFiles%\PostgreSQL\12\bin && SET PGPASSWORD=mypassword&& pg_restore.exe -U username -d dbname C:\file\to\dump\my.dump";
Process.Start("cmd.exe", arg);
0 голосов
/ 24 октября 2019

Попробуйте это:

var command = "SET PGPASSWORD=mypassword && pg_restore.exe";
var param = "-U username -d dbname C:\file\to\dump\my.dump";
var process = new Process();
var processInfo = new ProcessStartInfo(command, param)
            {
                WorkingDirectory = @"%ProgramFiles%\PostgreSQL\12\bin"
            };
process.StartInfo = processInfo;
process.WaitForExit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...