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
重要的是,论点以
尝试了@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(); |
关于
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); |
您可以简单地使用
使用此C代码: