关于c#:运行命令提示符命令

Run Command Prompt Commands

有没有办法从C应用程序中运行命令提示命令?如果是,我将如何执行以下操作:

1
copy /b Image1.jpg + Archive.rar Image2.jpg

这基本上在JPG图像中嵌入了一个RAR文件。我只是想知道是否有一种方法可以在C中自动完成这项工作。


这就是从C运行shell命令所需的全部操作。#

1
2
3
string strCmdText;
strCmdText="/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);

编辑:

这是为了隐藏命令窗口。

1
2
3
4
5
6
7
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName ="cmd.exe";
startInfo.Arguments ="/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.StartInfo = startInfo;
process.Start();

编辑:2

重要的是,论点以/C开头,否则它将不起作用。斯科特·弗格森如何说:它"执行字符串指定的命令,然后终止。"


尝试了@rameshvel解决方案,但我无法在控制台应用程序中传递参数。如果有人遇到同样的问题,这里有一个解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Diagnostics;

Process cmd = new Process();
cmd.StartInfo.FileName ="cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

cmd.StandardInput.WriteLine("echo Oscar");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());


1
2
3
4
5
6
7
8
9
10
11
var proc1 = new ProcessStartInfo();
string anyCommand;
proc1.UseShellExecute = true;

proc1.WorkingDirectory = @"C:\Windows\System32";

proc1.FileName = @"C:\Windows\System32\cmd.exe";
proc1.Verb ="runas";
proc1.Arguments ="/c"+anyCommand;
proc1.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(proc1);


虽然从技术上讲,这并不能直接回答所提出的问题,但它确实回答了如何做原始海报想要做的事情的问题:合并文件。如果有的话,这篇文章可以帮助新手理解亨特和康斯坦丁在谈论什么。

这是我用来组合文件的方法(在本例中是JPG和ZIP)。请注意,我创建了一个缓冲区,其中填充了zip文件的内容(以小块而不是一个大的读取操作),然后将缓冲区写入JPG文件的后面,直到到达zip文件的结尾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void CombineFiles(string jpgFileName, string zipFileName)
{
    using (Stream original = new FileStream(jpgFileName, FileMode.Append))
    {
        using (Stream extra = new FileStream(zipFileName, FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[32 * 1024];

            int blockSize;
            while ((blockSize = extra.Read(buffer, 0, buffer.Length)) > 0)
            {
                original.Write(buffer, 0, blockSize);
            }
        }
    }
}

以上的答案都不起作用,因为某些原因,似乎它们会扫除地毯下的错误,使故障排除变得困难。所以我最终做了这样的事情,也许它能帮助其他人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\tf.exe",
        Arguments ="checkout AndroidManifest.xml",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = @"C:\MyAndroidApp"
    }
};

proc.Start();


是的,有(参见MattHamilton评论中的链接),但是使用.NET的IO类会更容易、更好。可以使用file.readallbytes读取文件,然后使用file.writeallbytes写入"嵌入"版本。


您可以在一行中使用cliwrap进行此操作:

1
2
3
var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;


这里有一些简单的代码版本。它也会隐藏控制台窗口-

1
2
3
4
5
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName ="cmd.exe";
process.StartInfo.Arguments ="/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.Start();


关于Microsoft.VisualBasic

1
Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);

如果您想让命令窗口保持打开状态,或者想在winform/wpf中使用它,那么就这样使用它

1
2
3
4
5
    string strCmdText;
//For Testing
    strCmdText="/K ipconfig";

 System.Diagnostics.Process.Start("CMD.exe",strCmdText);

/K

将保持命令窗口打开


您可以使用以下方法(如其他答案中所述)实现此目的:

1
2
strCmdText ="'/C some command";
Process.Start("CMD.exe", strCmdText);

当我尝试上面列出的方法时,我发现我的自定义命令无法使用上面一些答案的语法。

我发现更复杂的命令需要用引号封装才能工作:

1
2
3
string strCmdText;
strCmdText ="'/C cd" + path +" && composer update && composer install -o'";
Process.Start("CMD.exe", strCmdText);


您可以简单地使用.bat格式扩展名编写代码,即批处理文件的代码:

c:/ copy /b Image1.jpg + Archive.rar Image2.jpg

使用此C代码:

Process.Start("file_name.bat")