流程不会以双引号开始

时间:2018-09-25 15:01:44

标签: c# batch-file process

我正在尝试将文件夹复制到特权文件夹(C:\ Program Files(x86))

为此,我通过C#函数以管理员身份运行批处理文件

批处理文件只是:

robocopy %1 %2 /E

在Windows cmd文件夹上进行手动写入时,subs复制得很好,但是在我的程序中不起作用,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 :(得分:0)

当您尝试使用.bat动词启动.cmd文件或runas文件时,系统会在注册表中查找应执行的相应命令。

注册表为runas.bat文件的.cmd动词提供以下命令值:

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

({%1将接收批处理文件的名称,%*将接收传递给该批处理文件的参数。)

此命令是导致问题的原因。缺少的是"%1" %*周围有一些引号(例如""%1" %*")。 cmd.exe将启动(您会注意到这是一个短暂出现的cmd shell窗口)。但是此命令向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"之后的所有参数都用双引号对构成。同样,每个参数本身都用双引号引起来,因此,如果源路径或指向该路径的路径也可以使用批处理文件将包含空格。)