C# 无法在 EXE 中运行带空格的命令

问题描述 投票:0回答:1

我尝试通过 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”不被识别为内部或外部命令, 可运行的程序或批处理文件。

c# process command
1个回答
0
投票
startInfo.Arguments = $@"/k ""{command}""";

如果命令字符串包含多个引号对,只需将命令字符串括在另一对引号中即可。查看文档了解

/k
开关的规则:cmd.exe

补充说明:

  1. 我建议您添加

    /s
    开关,这样无论命令字符串是否符合这些规则,上述方法始终适用。

  2. 使用

    /k
    开关将要求您手动退出cmd进程。如果这不是您所期望的,您应该将其替换为
    /c
    开关。

    startInfo.Arguments = $@"/s /c ""{command}""";
    
© www.soinside.com 2019 - 2024. All rights reserved.