C # 응용 프로그램 내에서 명령 프롬프트 명령을 실행하는 방법이 있습니까? 그렇다면 어떻게 다음을 수행합니까?
copy /b Image1.jpg + Archive.rar Image2.jpg
이것은 기본적으로 JPG 이미지 내에 RAR 파일을 포함합니다. C #에서 자동으로 수행 할 수있는 방법이 있는지 궁금합니다.
C # 응용 프로그램 내에서 명령 프롬프트 명령을 실행하는 방법이 있습니까? 그렇다면 어떻게 다음을 수행합니까?
copy /b Image1.jpg + Archive.rar Image2.jpg
이것은 기본적으로 JPG 이미지 내에 RAR 파일을 포함합니다. 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이 자식 프로세스로 리디렉션되지 않았기 때문에 의미가 있습니다).
기술적으로 이것은 제기 된 질문에 직접 대답하지는 않지만 원본 포스터가 원하는 것을 수행하는 방법에 대한 질문에 대답합니다 : 파일 결합. 이 글은 초보자가 인스턴스 헌터와 콘스탄틴이 무슨 말을하는지 이해하도록 돕기위한 게시물입니다.
이것은 파일을 결합하는 데 사용하는 방법입니다 (이 경우 jpg 및 zip). zip 파일의 내용으로 채워지는 버퍼를 작성하고 (하나의 큰 읽기 작업이 아닌 작은 덩어리로) zip 파일의 끝이 끝날 때까지 jpg 파일의 뒷면에 버퍼가 기록됩니다. 도달 :
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);
}
}
}
}
그렇습니다 (Matt Hamilton의 의견에있는 링크 참조). 그러나 .NET의 IO 클래스를 사용하는 것이 더 쉽고 좋습니다. 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
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();
비동기 모드에서 명령을 실행하고 결과를 인쇄하려는 경우. 당신은이 수업을 할 수 있습니다 :
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);