我尝试通过 C# 从 Visual Studio 2017 目标框架是 .NET 4.5 执行此命令。无论我尝试将其用引号括起来,它都不会触发,因为
EXE
文件名中存在空格。我读到其他人都通过用引号引起来解决了这个问题,但它不起作用。我使用的是 Windows 10.0.19045.4046
static void Main(string[] args)
{
// Export Current Settings
string cncmd = GetCnCMD();
string AMD3D = (System.IO.Path.GetTempPath() + @"\AMD3DSettings.zip").Replace(@"\\", @"\");
Run("\"" + cncmd + "\" export \"" + AMD3D + "\" >%TMP%\\Log3d.txt");
}
static void Run(string command)
{
Console.WriteLine(command);
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
startInfo.FileName = @"cmd.exe";
startInfo.Arguments = "/k " + command;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
}
public static string GetCnCMD()
{
try
{
RegistryKey HKLM = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey cnkey = HKLM.OpenSubKey(@"SOFTWARE\AMD\CN");
string dir = (string) cnkey.GetValue("InstallDir");
if (dir.EndsWith(@"\") || dir.EndsWith(@"/"))
{
dir = dir.Substring(0, dir.Length - 1);
}
return dir + @"\cncmd.exe";
}
catch(Exception e)
{
Console.Error.WriteLine(e.Message + " " + e.GetType());
string HOMEDRIVE = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
string cncmd = HOMEDRIVE + @":\Program Files\AMD\CNext\CNext\cncmd.exe";
if (File.Exists(cncmd))
return cncmd;
cncmd = HOMEDRIVE + @":\Program Files (x86)\AMD\CNext\CNext\cncmd.exe";
if (File.Exists(cncmd))
return cncmd;
// Check older or newer likely paths
cncmd = HOMEDRIVE + @":\Program Files\AMD\CNext\cncmd.exe";
if (File.Exists(cncmd))
return cncmd;
cncmd = HOMEDRIVE + @":\Program Files (x86)\AMD\CNext\cncmd.exe";
if (File.Exists(cncmd))
return cncmd;
}
return null;
}
输出cmd窗口1:
"C:\Program Files\AMD\CNext\CNext\cncmd.exe" export "C:\Users\jredfox\AppData\Local\Temp\AMD3DSettings.zip" >%TMP%\Log3d.txt
输出cmd窗口2:
“C:\Program”不被识别为内部或外部命令, 可运行的程序或批处理文件。
startInfo.Arguments = $@"/k ""{command}""";
如果命令字符串包含多个引号对,只需将命令字符串括在另一对引号中即可。查看文档了解
/k
开关的规则:cmd.exe
补充说明:
我建议您添加
/s
开关,这样无论命令字符串是否符合这些规则,上述方法始终适用。
使用
/k
开关将要求您手动退出cmd进程。如果这不是您所期望的,您应该将其替换为 /c
开关。
startInfo.Arguments = $@"/s /c ""{command}""";