มีวิธีการเรียกใช้คำสั่งที่พร้อมรับคำสั่งจากภายในแอปพลิเคชัน C # หรือไม่? ถ้าเป็นเช่นนั้นฉันจะทำสิ่งต่อไปนี้:
copy /b Image1.jpg + Archive.rar Image2.jpg
สิ่งนี้จะรวมไฟล์ RAR ไว้ภายในรูปภาพ JPG ฉันแค่สงสัยว่ามีวิธีการทำเช่นนี้โดยอัตโนมัติใน C #
มีวิธีการเรียกใช้คำสั่งที่พร้อมรับคำสั่งจากภายในแอปพลิเคชัน C # หรือไม่? ถ้าเป็นเช่นนั้นฉันจะทำสิ่งต่อไปนี้:
copy /b Image1.jpg + Archive.rar Image2.jpg
สิ่งนี้จะรวมไฟล์ RAR ไว้ภายในรูปภาพ JPG ฉันแค่สงสัยว่ามีวิธีการทำเช่นนี้โดยอัตโนมัติใน C #
คำตอบ:
นี่คือทั้งหมดที่คุณต้องทำเพื่อเรียกใช้คำสั่งเชลล์จาก C #
string strCmdText;
strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);
แก้ไข:
นี่คือการซ่อนหน้าต่าง cmd
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 แต่ฉันไม่สามารถส่งผ่านข้อโต้แย้งในแอปพลิเคชันคอนโซลของฉัน หากใครประสบปัญหาเดียวกันนี่คือวิธีแก้ไข:
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());
cmd.StandardInput.WriteLine(@"cd C:\Test; pwd")
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);
@
สัญญาณใน C #?
proc1.FileName = "C:\\Windows\\System32\\cmd.exe";
proc1.Verb = "runas";
ทำให้กระบวนการนี้ทำงานด้วยสิทธิ์ระดับสูง ... นี้ไม่ได้ตั้งใจเสมอ
ไม่มีคำตอบข้างต้นที่ช่วยด้วยเหตุผลบางอย่างดูเหมือนว่าพวกเขากวาดข้อผิดพลาดภายใต้พรมปูพื้นและทำให้คำสั่งการแก้ไขปัญหาของคนยาก ดังนั้นฉันเลยไปกับอะไรแบบนี้บางทีมันอาจช่วยคนอื่นได้:
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();
cmd.exe
แอพคุณสามารถส่งคำสั่งเป็นอาร์กิวเมนต์
echo Hello World!
และแสดงเอาต์พุตคำสั่งในหน้าต่าง cmd ที่ปรากฏขึ้น Filename = @"echo"
ดังนั้นผมจึงพยายาม: Arguments = "Hello World!"
, UseShellExecute = false
, RedirectStandardOuput = false
, CreateNoWindow = false
, สิ่งนี้อนุญาตให้หน้าต่าง cmd ของแอปพลิเคชันหลักแสดง "Hello World!" (ซึ่งสมเหตุสมผลเนื่องจาก stdout ไม่ได้ถูกเปลี่ยนเส้นทางไปยังกระบวนการย่อย)
แม้ว่าเทคนิคนี้จะไม่ตอบคำถามโดยตรง แต่ก็ตอบคำถามว่าจะทำอย่างไรในสิ่งที่โปสเตอร์ดั้งเดิมต้องการทำ: รวมไฟล์เข้าด้วยกัน หากมีสิ่งใดสิ่งนี้เป็นโพสต์เพื่อช่วยให้มือใหม่เข้าใจว่า Instance Hunter และ Konstantin กำลังพูดถึงอะไร
นี่เป็นวิธีที่ฉันใช้เพื่อรวมไฟล์ (ในกรณีนี้คือ jpg และ zip) โปรดทราบว่าฉันสร้างบัฟเฟอร์ที่เต็มไปด้วยเนื้อหาของไฟล์ zip (เป็นชิ้นเล็ก ๆ มากกว่าการดำเนินการอ่านครั้งใหญ่) จากนั้นบัฟเฟอร์จะถูกเขียนไปที่ด้านหลังของไฟล์ jpg จนกว่าจะสิ้นสุดไฟล์ zip ถึง:
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);
}
}
}
}
หากคุณต้องการเปิดหน้าต่าง cmd หรือต้องการใช้งานใน winform / wpf ให้ใช้เช่นนี้
string strCmdText;
//For Testing
strCmdText= "/K ipconfig";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);
/ K
จะเปิดหน้าต่าง cmd
ใช่มี (ดูลิงค์ในความคิดเห็นของ Matt Hamilton) แต่จะง่ายกว่าและดีกว่าถ้าใช้คลาส IO ของ. NET คุณสามารถใช้ File.ReadAllBytes เพื่ออ่านไฟล์จากนั้น File.WriteAllBytes เพื่อเขียนเวอร์ชัน "ฝังตัว"
คุณสามารถทำได้โดยใช้CliWrapในหนึ่งบรรทัด:
var stdout = new Cli("cmd")
.Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
.StandardOutput;
Unable to find package 'CliWrap' at source
มีการอ้างอิงถึง Microsoft.VisualBasic
Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);
นี่คือรุ่นรหัสที่ง่ายและน้อยกว่าเล็กน้อย มันจะซ่อนหน้าต่างคอนโซลด้วย -
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();
หากคุณต้องการเรียกใช้คำสั่งในโหมด async - และพิมพ์ผลลัพธ์ คุณเรียนชั้นนี้ได้:
public static class ExecuteCmd
{
/// <summary>
/// Executes a shell command synchronously.
/// </summary>
/// <param name="command">string command</param>
/// <returns>string, as output of the command.</returns>
public static void ExecuteCommandSync(object command)
{
try
{
// create the ProcessStartInfo using "cmd" as the program to be run, and "/c " as the parameters.
// Incidentally, /c tells cmd that we want it to execute the command that follows, and then exit.
System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
// The following commands are needed to redirect the standard output.
//This means that it will be redirected to the Process.StandardOutput StreamReader.
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
// Do not create the black window.
procStartInfo.CreateNoWindow = true;
// Now we create a process, assign its ProcessStartInfo and start it
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
// Get the output into a string
string result = proc.StandardOutput.ReadToEnd();
// Display the command output.
Console.WriteLine(result);
}
catch (Exception objException)
{
// Log the exception
Console.WriteLine("ExecuteCommandSync failed" + objException.Message);
}
}
/// <summary>
/// Execute the command Asynchronously.
/// </summary>
/// <param name="command">string command.</param>
public static void ExecuteCommandAsync(string command)
{
try
{
//Asynchronously start the Thread to process the Execute command request.
Thread objThread = new Thread(new ParameterizedThreadStart(ExecuteCommandSync));
//Make the thread as background thread.
objThread.IsBackground = true;
//Set the Priority of the thread.
objThread.Priority = ThreadPriority.AboveNormal;
//Start the thread.
objThread.Start(command);
}
catch (ThreadStartException )
{
// Log the exception
}
catch (ThreadAbortException )
{
// Log the exception
}
catch (Exception )
{
// Log the exception
}
}
}
คุณสามารถทำได้โดยใช้วิธีการดังต่อไปนี้ (ดังที่กล่าวไว้ในคำตอบอื่น ๆ ):
strCmdText = "'/C some command";
Process.Start("CMD.exe", strCmdText);
เมื่อฉันลองวิธีที่กล่าวข้างต้นฉันพบว่าคำสั่งที่กำหนดเองของฉันไม่ทำงานโดยใช้ไวยากรณ์ของคำตอบบางข้อด้านบน
ฉันพบคำสั่งที่ซับซ้อนมากขึ้นจะต้องมีการห่อหุ้มในเครื่องหมายคำพูดเพื่อทำงาน:
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")
.vbs
ขยายรูปแบบรหัส:CreateObject("Wscript.Shell").Run "filename.bat",0,True