Процесс не начнется с двойных кавычек - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь скопировать папку в привилегированную (C: \ Program Files (x86))

Для этого я запускаю Batch-файл от имени администратора с помощью функции C #

Пакетный файл просто:

robocopy %1 %2 /E

При записи вручную в папку Windows cmd и подпрограммы хорошо копируются, но это не работает в моей программе, proc.start () мгновенно закрывается

String SourcePath = @"Z:\Path\To\My\Source\Directory";
# Variable contains whitespaces (Program Files (x86))        
String DestinationPath = System.Environment.GetEnvironmentVariable("MYVAR") + "DestDir";

System.Diagnostics.Process proc = new Process();
proc.StartInfo.FileName = @"Z:\Path\To\My\BatFile\File.bat";

# "\"" so there should be no problem with whitespaces
proc.StartInfo.Arguments = SourcePath + " \"" + DestinationPath + "\"";
proc.StartInfo.Verb = "runas";

try
{
    proc.Start();
    proc.WaitForExit();
}
catch (Exception e)
{
    Console.WriteLine("Exception: " + e.Message);
}

Есть идеи, почему это не работает?

Я открыт для более умной идеи, если у вас есть

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2018

Когда вы пытаетесь запустить файл .bat или .cmd с глаголом rhe runas, система ищет соответствующую команду, которую должна выполнить в реестре.

Реестр предоставляетследующее значение команды для глагола runas для файлов .bat и .cmd:

%SystemRoot%\System32\cmd.exe /C "%1" %*

(%1 получит имя пакетного файла, %* получит аргументы, переданные впакетный файл.)

И эта команда является причиной проблемы.Чего не хватает, так это некоторых окружающих кавычек вокруг "%1" %* (например, ""%1" %*").Будет запущен cmd.exe (который вы заметили как кратко появившееся окно оболочки cmd).Но способ, которым эта команда предоставляет аргументы cmd.exe, неправильный, что приводит к сбою cmd.exe при запуске командного файла.

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

Скорее, я предлагаю запустить ваш пакетный файл вместе с cmd.exe, чтобы вы не делалине полагайтесь на реализацию команды runas реестра для .bat / .cmd файлов:

var pathToBatchFile = @"Z:\Path\To\My\BatFile\File.bat";
string SourcePath = ...
string DestinationPath = ...

System.Diagnostics.Process proc = new Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = $"/c \"\"{pathToBatchFile}\" \"{SourcePath}\" \"{DestinationPath}\"\"";
proc.StartInfo.Verb = "runas";
...

(Обратите внимание, что все аргументы, следующие за "cmd.exe /c" вместе, заключены в двойные кавычки. Такжекаждый отдельный аргумент помещается в двойные кавычки, поэтому это также должно работать, если исходный путь или путь к пакетному файлу будет содержать пробелы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...