Когда вы пытаетесь запустить файл .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"
вместе, заключены в двойные кавычки. Такжекаждый отдельный аргумент помещается в двойные кавычки, поэтому это также должно работать, если исходный путь или путь к пакетному файлу будет содержать пробелы.)