명령 프롬프트 명령 실행


605

C # 응용 프로그램 내에서 명령 프롬프트 명령을 실행하는 방법이 있습니까? 그렇다면 어떻게 다음을 수행합니까?

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

이것은 기본적으로 JPG 이미지 내에 RAR 파일을 포함합니다. C #에서 자동으로 수행 할 수있는 방법이 있는지 궁금합니다.


6
stackoverflow.com/questions/181719/…복제본 (당신이 원하는 것을하는 답변이 있습니다).
매트 해밀턴

stackoverflow.com/a/5367686/492 는 더 나은 답변을 가지고 있습니다
CAD

답변:


917

이것은 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되지 않으면 시작 하지 않는다는 것입니다. 어떻게 스콧 퍼거슨 감독은 말했다 : 그것은 "문자열에 의해 지정된 명령을 수행 한 후 종료합니다."


166
/ C 문자열로 지정된 명령을 수행 한 다음 종료
Scott Ferguson

16
그것은 단지 cmd에게 실행 및 종료를 지시하는 것입니다 (사용자 입력이 창을 닫을 때까지 기다리지
마십시오

3
하나 더 질문 감사합니다. 이 동안 명령 프롬프트를 숨기는 방법이 있습니까?
사용자

9
나는 이것이 끔찍한 생각이라고 생각하는 유일한 사람이 아닌지 모른다. 예, 이것은 작동하지만 완전히 그리고 완전히 잘못되었습니다. 간단한 IO 작업을 수행하기 위해 CMD 프로세스를 생성하면 작동하더라도 잘못됩니다. System.IO 네임 스페이스의 설명서를 읽으십시오. 불필요한 프로세스를 생성하지 않고 필요한 작업을 수행 할 수있는 기능이 충분합니다.
인스턴스 헌터

56
참고 : process.WaitForExit ()를 사용하여 계속 진행하기 전에 프로세스가 완료 될 때까지 대기하고 process.ExitCode를 사용하여 프로세스의 종료 코드를 가져 오십시오.
shindigo

122

@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());

2
글쎄, 내 컴퓨터에는 관리자 또는 안티 바이러스 제한이 있다고 생각하지 않았지만 위의 코드는 작동합니다! 감사 Ogglas
피트 코작

6
이 줄 : cmd.StartInfo.CreateNoWindow = true; 내 하루를 구했다.
Ganesh Kamath- '코드 열풍'

하나에서 여러 명령을 실행하는 방법이 있나요cmd.StandardInput.WriteLine(@"cd C:\Test; pwd")
자크 스미스

36
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);

2
@C # 의 부호는 무엇입니까 ?
Pacerier

6
@Pacerier 일반적으로 문자열에서 이스케이프해야하는 모든 문자를 이스케이프하도록 컴파일러에 지시합니다 (이 경우에는 \). 따라서 \가 없으면 코드는 다음과 같습니다proc1.FileName = "C:\\Windows\\System32\\cmd.exe";
James Ko

1
proc1.Verb = "runas";이 프로세스가 상승 된 권한으로 실행되게 하는 것이 중요 합니다. 이것은 항상 의도 된 것은 아닙니다.
Dinei

1
이 cmd 창이 완료된 후에 닫히지 않게하려면 어떻게해야합니까?
Hrvoje T

1
라인의 다른 명령과 '&&'가 결합 된 'cd path'를 호출하면 처음에가더라도 항상 마지막으로 실행됩니다. 귀하의 : 'proc1.WorkingDirectory = @ "C : \ Windows \ System32";' 매우 도움이되었습니다! 감사!
노짐 투 라쿠 로프

11

위의 답변 중 어떤 것도 어떤 이유로 든 도움이되지 못했습니다. 러그에서 오류를 스윕하고 명령 문제 해결을 어렵게하는 것처럼 보입니다. 그래서 나는 이런 식으로 끝났습니다. 아마도 다른 누군가를 도울 것입니다 :

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();

이것을 독립형 콘솔 응용 프로그램으로 컴파일하려면 작동하려면 다른 코드를 추가해야합니까? (나는이 모든 프로그래밍 작업에 멍청한 놈이며 일부 스크립팅 만 수행했습니다). csc.exe btw를 사용하고 있습니다.
script'n'code

@copyitright 네임 스페이스와 클래스. 새 프로젝트를 만들면 프로젝트가 자동으로 생성됩니다.
coinbird

아 신경 쓰지 마. cmd.exe앱 을 사용하면 명령을 인수로 전달할 수 있습니다.
Zach Smith

후손을 위해 : 프로세스가 실행 echo Hello World!되고 팝업되는 cmd 창에 명령 출력이 표시 되기를 원 했습니다. 내가 시도 그래서 : Filename = @"echo", Arguments = "Hello World!", UseShellExecute = false, RedirectStandardOuput = false, CreateNoWindow = false. 이를 통해 상위 응용 프로그램의 cmd 창에 "Hello World!"가 표시되었습니다. (stdout이 자식 프로세스로 리디렉션되지 않았기 때문에 의미가 있습니다).
Minh Tran

10

기술적으로 이것은 제기 된 질문에 직접 대답하지는 않지만 원본 포스터가 원하는 것을 수행하는 방법에 대한 질문에 대답합니다 : 파일 결합. 이 글은 초보자가 인스턴스 헌터와 콘스탄틴이 무슨 말을하는지 이해하도록 돕기위한 게시물입니다.

이것은 파일을 결합하는 데 사용하는 방법입니다 (이 경우 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);
            }
        }
    }
}

9

cmd 창을 열어 두거나 winform / wpf에서 사용하려면 다음과 같이 사용하십시오

    string strCmdText;
//For Testing
    strCmdText= "/K ipconfig";

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

/케이

cmd 창을 열어 둡니다


좋은. 명령 및 해당 매개 변수에 대한 이 문서 를 찾았습니다 cmd.
pius

8

그렇습니다 (Matt Hamilton의 의견에있는 링크 참조). 그러나 .NET의 IO 클래스를 사용하는 것이 더 쉽고 좋습니다. File.ReadAllBytes를 사용하여 파일을 읽은 다음 File.WriteAllBytes를 사용하여 "임베디드"버전을 쓸 수 있습니다.


11
하나의 파일을 다른 파일에 추가하기 위해 전체 파일을 메모리에로드하는 것은 특히 효율적이지 않습니다 (특히 파일이 충분히 큰 경우).
Konstantin Spirin

7
답의 정신을 보도록 노력하십시오. 요점은 .NET에는 OS 쉘을 호출하지 않고도이를 수행하기에 충분한 IO 클래스와 함수가 있다는 것입니다. 내가 언급 한 특정 기능은 최고는 아니지만 가장 단순했습니다. 이 작업을 수행하기 위해 쉘을 호출하는 것은 전혀 의미가 없습니다.
인스턴스 헌터

7

한 줄에 CliWrap 을 사용 하여이 작업을 수행 할 수 있습니다 .

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

나는 이것을 upvoted ...하지만 레포가 지금 누락 된 것 같습니다 :Unable to find package 'CliWrap' at source
Zach Smith

1
@ZachSmith 무슨 뜻인지 모르겠다, nuget.org/packages/CliWrap 은 잘 작동하는 것 같습니다. 원본 링크도.
Tyrrrz

Ah. 죄송합니다. 어떤 이유로 VPN을 통해 너겟 저장소에 연결할 수 없었을 때이 패키지를 설치할 수 없었습니다. 너겟은 여전히 ​​저에게 미스터리입니다. 잘못을 설정해야합니다
자크 스미스에게


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();

5

비동기 모드에서 명령을 실행하고 결과를 인쇄하려는 경우. 당신은이 수업을 할 수 있습니다 :

    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
        }
    }

}

2

다른 답변에서 언급 한 것처럼 다음 방법을 사용하여이를 달성 할 수 있습니다.

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);

1

당신은에있는 코드를 작성하는 간단하게 사용할 수있는 .bat형식으로 확장, 배치 파일의 코드 :

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

이 C # 코드를 사용하십시오.

Process.Start("file_name.bat")


실행하는 동안 cmd를 숨기려면 .vbs형식 확장 에 간단한 Visual Basic 스크립트 코드를 사용할 수 있습니다 .CreateObject("Wscript.Shell").Run "filename.bat",0,True
XMMR12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.