2012-02-08 6 views
0

cmd에서 C#을 사용하여 명령을 실행하려고하는데 몇 가지 어려움이 있습니다. 나는 그것이 실행하려고하는 것을 볼 수 있도록 cmd 콘솔에 명령을 쓸 수 있기를 바란다. (나는 따옴표 또는 어떤 문제가 있다고 생각한다. 그래서 명령 행에서 실제 문자열을 볼 수 있다면 나는 문제가 무엇인지 정확히 알 수 있습니다.) 내 코드는 다음과 같습니다 :cmd 콘솔에서 명령 표시

var processStartInfo = new ProcessStartInfo("cmd", "/c"+commandString); 
processStartInfo.CreateNoWindow = true; 
Process.Start(processStartInfo); 

그래서 기본적으로 콘솔에 쓰여진 commandString 문자열을보고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다.

string CommandLineString = @"""C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe"" ""SELECT * FROM table where date >= '2009-01-01'"" queryout ""C:\Data\data.dat"" -S DBSW0323 -d CMS -n -T"; 

답변

2

이 경우 "/ c"다음에 공백이 부족한 것일 수 있습니다. 명령 창에서 볼 수있는 바와 같이

var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

대신, 당신은 아마 당신의 processStartInfo 인스턴스의 Arguments 속성을 검사 더 나을 것입니다. 명령 줄 당신이 게시 사항 고려하여

편집

, 나는이 문제가 무엇인지 믿습니다. cmd 도움말에서 다음을 확인하십시오.

If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters:

  1. If all of the following conditions are met, then quote characters on the command line are preserved:

    • no /S switch
    • exactly two quote characters
    • no special characters between the two quote characters, where special is one of: &<>()@^|
    • there are one or more whitespace characters between the the two quote characters
    • the string between the two quote characters is the name of an executable file.

/c를 사용하고 있으므로 인용 부호 및 특수 문자 문제가 계속 발생합니다. commandString 전체를 따옴표로 묶어보십시오. 될 것입니다

string commandString = @"""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt"""; 
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

실행하는 명령 줄을 : /c "C:\WINDOWS\Notepad.exe" "C:\temp.txt"을, 그러나 이것은 C "때문에 실패합니다

은 (수동 물론 TEMP.TXT 생성) 예를 들어이 간단한 예제를 가지고 \ TEMP.TXT "실행 파일이 아닙니다.

string commandString = @"""""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt"""""; 
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

의 명령 행의 결과 : /c ""C:\WINDOWS\Notepad.exe" "C:\temp.txt"" 궁극적으로 테스트 파일을 메모장을 여는 따옴표의 마지막 세트 전체를 감싸는 경우

, 당신은 의도 된 결과를 볼 수 있습니다.

+0

이것은 실제로 문제가되지만 여전히 불행하게도 작동하지 않습니다. – sooprise

+0

사용중인 명령 및 arg에 대한 자세한 정보를 제공 할 수 있습니까? 커맨드 라인 테스트와 애플리케이션 테스트간에 다른 커맨드가 실행되는 기본 디렉토리에 문제가있을 수 있습니까? –

+0

@sooprise : 이스케이프 문자를 사용하는 데 문제가있는 경우 문자열을 C : \ sumptin 대신'@ "C : \ sumptin"에서와 같이'@'로 시작하는 것이 좋습니다. –

0

해당 문자열은 콘솔에 "기록되지"않으며, 실행 한 프로그램의 인수 목록에 포함됩니다 (이 경우 cmd.exe 일 수 있음). 생성 된 콘솔은 그 프로그램이 소유하고 있기 때문에, 자신의 주장을 인자로 출력하기를 원하지 않는다면 (직접적으로 할 수는 없다), 이것은 직접 할 수 없다.

단순히 디버그하려면 commandString의 값을 검사하지 않거나 로그 파일에 기록하지 않으시겠습니까? 다른 좋은가없는

당신이 절대적으로 명령 줄을해야하는 경우

그런 다음이 해킹에 의존 (명령 행 및 다음 통화 그것으로 cmd.exe를 인쇄 다른 중간 프로그램을 실행) 할 수도 있지만 콘솔에 표시 할 이 접근법을 사용하는 이유는 그것을 권장하지 않습니다.

+0

Jon, 어쩌면 내 접근 방식에 대한 의견을 나에게 줄 수 있습니다. commandString을 사용하여 모든 이스케이프 문자를 제거하고 cmd에서 명령을 직접 실행하면 제대로 작동하지만 C#에서 다음 오류가 발생합니다. 파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다. 명령의 유일한 차이점은 이스케이프 문자이므로 여기에서 뭔가 잘못하고있을 수도 있습니다. 그것을 고치는 가장 좋은 방법은 무엇인지 확실하지 않습니다. – sooprise

+0

@sooprise : 먼저 공간 문제가 있는지 확인하십시오. – Jon

+0

Jon, 이미 시도했지만 작동하지 않습니다. – sooprise

관련 문제