我正在尝试将文件夹复制到特权文件夹(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);
}
知道为什么它不起作用吗?
如果您有任何想法,我很乐意
谢谢
答案 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"
之后的所有参数都用双引号对构成。同样,每个参数本身都用双引号引起来,因此,如果源路径或指向该路径的路径也可以使用批处理文件将包含空格。)