programing

명령 프롬프트 실행 명령

batch 2023. 5. 6. 14:11
반응형

명령 프롬프트 실행 명령

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그렇지 않으면 작동하지 않을 것입니다.@scott-ferguson이 말했듯이: /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());
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);

위의 답변 중 어떤 이유로든 도움이 되지 않았습니다. 오류를 은폐하고 명령 문제 해결을 어렵게 만드는 것 같습니다.그래서 저는 이런 일을 하게 되었습니다. 아마도 다른 누군가에게 도움이 될 것입니다.

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

기술적으로 이것은 제기된 질문에 직접적으로 답하지는 않지만, 원래 포스터가 하고자 했던 것, 즉 파일을 결합하는 방법에 대한 질문에 답합니다.오히려, 이것은 신입생들이 인스턴스 헌터와 콘스탄틴이 이야기하는 것을 이해하도록 돕는 게시물입니다.

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

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

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

}

cmd 창을 열어두거나 winform/wpf에서 사용하려면 다음과 같이 사용합니다.

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

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

/K

cmd 창을 열어 둡니다.

예, 있습니다(Matt Hamilton의 코멘트 링크 참조). 하지만 사용하는 것이 더 쉽고 좋을 것입니다.NET의 IO 클래스.파일을 사용할 수 있습니다.모든 바이트 읽기를 눌러 파일을 읽은 다음 파일을 읽습니다.내장된 버전을 작성하려면 AllBytes를 작성합니다.

에 관하여

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

이것은 또한 C 표준 라이브러리의 기능을 P/Invoke하여 수행할 수 있습니다.

using System.Runtime.InteropServices;

[DllImport("msvcrt.dll")]
public static extern int system(string format);

system("copy Test.txt Test2.txt");

출력:

      1 file(s) copied.

여기 간단한 코드 버전이 있습니다.콘솔 창도 가려져요

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

C#에서 명령 프롬프트 명령을 실행하는 데 사용하는 다음 방법이 있습니다.

첫 번째 매개 변수에서 실행할 명령 전달

public static string RunCommand(string arguments, bool readOutput)
{
    var output = string.Empty;
    try
    {
        var startInfo = new ProcessStartInfo
        {
            Verb = "runas",
            FileName = "cmd.exe",
            Arguments = "/C "+arguments,
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true,
            RedirectStandardError = false
        };

        var proc = Process.Start(startInfo);

        if (readOutput)
        {
            output = proc.StandardOutput.ReadToEnd(); 
        }

        proc.WaitForExit(60000);

        return output;
    }
    catch (Exception)
    {
        return output;
    }
}

다음 방법을 사용하여 이를 달성할 수 있습니다(다른 답변에서 언급한 바와 같이).

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

당신은 간단하게 코드를 쓸 수 있습니다..batextension , 파일의 : " 맷확장자포코드, " 파의일배치:코드":

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

다음 c# 코드 사용:

Process.Start("file_name.bat")

사용할 수 있습니다.RunProcessAsTask다음과 같이 쉽게 프로세스 비동기화를 패키징하고 실행할 수 있습니다.

var processResults = await ProcessEx.RunAsync("git.exe", "pull");
//get process result
foreach (var output in processResults.StandardOutput)
{
   Console.WriteLine("Output line: " + output);
}

이건 좀 읽을 수도 있어서 미리 죄송합니다.그리고 이것이 제가 시도하고 테스트한 방법입니다. 더 간단한 방법이 있을 수도 있지만, 이것은 제가 벽에 코드를 던져서 무엇이 고착되었는지 보는 것입니다.

배치 파일로 수행할 수 있다면 c#이 .bat 파일을 작성하여 실행하도록 하는 것이 너무 복잡할 수 있습니다.만약 당신이 사용자 입력을 원한다면, 당신은 입력을 변수에 넣고 c#가 그것을 파일에 쓰도록 할 수 있습니다.이것은 다른 꼭두각시로 인형을 조종하는 것과 같기 때문에 시행착오를 겪을 것입니다.

예를 들어, 이 경우 이 기능은 인쇄 대기열을 지우는 윈도우 포럼 앱의 푸시 버튼을 위한 것입니다.

using System.IO;
using System;

   public static void ClearPrintQueue()
    {

        //this is the path the document or in our case batch file will be placed
        string docPath =
         Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        //this is the path process.start usues
        string path1 = docPath + "\\Test.bat";

        // these are the batch commands
        // remember its "", the comma separates the lines
        string[] lines =
        {
            "@echo off",
            "net stop spooler",
            "del %systemroot%\\System32\\spool\\Printers\\* /Q",
            "net start spooler",
            //this deletes the file
            "del \"%~f0\"" //do not put a comma on the last line
        };

        //this writes the string to the file
        using (StreamWriter outputFile = new StreamWriter(Path.Combine(docPath, "test.bat")))
        {
            //This writes the file line by line
            foreach (string line in lines)
                outputFile.WriteLine(line);
        }
        System.Diagnostics.Process.Start(path1);

    }

만약 당신이 사용자 입력을 원한다면, 당신은 다음과 같은 것을 시도할 수 있습니다.

이는 컴퓨터 IP를 정적으로 설정하지만 IP, 게이트웨이 및 DNS 서버가 무엇인지 사용자에게 묻기 위한 것입니다.

당신은 그것이 작동하기 위해 이것이 필요할 것입니다.

public static void SetIPStatic()
    {
//These open pop up boxes which ask for user input
        string STATIC = Microsoft.VisualBasic.Interaction.InputBox("Whats the static IP?", "", "", 100, 100);
        string SUBNET = Microsoft.VisualBasic.Interaction.InputBox("Whats the Subnet?(Press enter for default)", "255.255.255.0", "", 100, 100);
        string DEFAULTGATEWAY = Microsoft.VisualBasic.Interaction.InputBox("Whats the Default gateway?", "", "", 100, 100);
        string DNS = Microsoft.VisualBasic.Interaction.InputBox("Whats the DNS server IP?(Input required, 8.8.4.4 has already been set as secondary)", "", "", 100, 100);



        //this is the path the document or in our case batch file will be placed
        string docPath =
         Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        //this is the path process.start usues
        string path1 = docPath + "\\Test.bat";

        // these are the batch commands
        // remember its "", the comma separates the lines
        string[] lines =
        {
            "SETLOCAL EnableDelayedExpansion",
            "SET adapterName=",
            "FOR /F \"tokens=* delims=:\" %%a IN ('IPCONFIG ^| FIND /I \"ETHERNET ADAPTER\"') DO (",
            "SET adapterName=%%a",
            "REM Removes \"Ethernet adapter\" from the front of the adapter name",
            "SET adapterName=!adapterName:~17!",
            "REM Removes the colon from the end of the adapter name",
            "SET adapterName=!adapterName:~0,-1!",
//the variables that were set before are used here
            "netsh interface ipv4 set address name=\"!adapterName!\" static " + STATIC + " " + STATIC + " " + DEFAULTGATEWAY,
            "netsh interface ipv4 set dns name=\"!adapterName!\" static " + DNS + " primary",
            "netsh interface ipv4 add dns name=\"!adapterName!\" 8.8.4.4 index=2",
            ")",
            "ipconfig /flushdns",
            "ipconfig /registerdns",
            ":EOF",
            "DEL \"%~f0\"",
            ""
        };

        //this writes the string to the file
        using (StreamWriter outputFile = new StreamWriter(Path.Combine(docPath, "test.bat")))
        {
            //This writes the file line by line
            foreach (string line in lines)
                outputFile.WriteLine(line);
        }
        System.Diagnostics.Process.Start(path1);

    }

내가 말했다시피.조금 복잡할 수도 있지만 배치 명령을 잘못 작성하지 않는 한 실패하지 않습니다.

언급URL : https://stackoverflow.com/questions/1469764/run-command-prompt-commands

반응형