2009-04-08 2 views
2

테스트를 위해 '시작> 실행'대화 상자 (cmd.exe 아님)를 사용하고 있습니다.-EncodedCommand가 사용 된 경우 PowerShell 출력을 리디렉션 할 수 없습니다.

이 잘 작동, 나는

powershell -Command 4+5 > c:\log.txt 

는하지만이 작동하지 않는 log.txt에 9 얻을 :

powershell -EncodedCommand IAA1ACsANwAgAA== > c:\log.txt 

그래서 내가 어떻게이 경우 출력을 리디렉션 할 수 있습니다?

실험 코드 :

function Test 
{ 
    $cmd = { 5+7 } 
    $encodedCommand = EncodeCommand $cmd 

    StartProcess "powershell -Command $cmd > c:\log.txt" 
    StartProcess "powershell -EncodedCommand $encodedCommand > c:\log2.txt" 
} 

function StartProcess($commandLine) 
{ 
    Invoke-WMIMethod -path win32_process -name create -argumentList $commandLine 
} 

function EncodeCommand($expression) 
{ 
    $commandBytes = [System.Text.Encoding]::Unicode.GetBytes($expression) 
    [Convert]::ToBase64String($commandBytes) 
} 

답변

4

전혀 리디렉션을 제공하는 것처럼 "실행"대화 상자가 보이지 않는다. According to this usenet post 콘솔이있는 경우에만 리디렉션이 발생합니다. 리디렉션 매개 변수가 인코딩 된 입력을받지 못하는 경우 리디렉션되도록 선택하는 powershell.exe에 의해 구문 분석되고 있는지 궁금합니다. Raymond Chen에 대한 질문처럼 들립니다.

어쨌든, 이것은 그렇지 않으면 쓸모없는 콘솔을 산란의 비용으로 작동합니다

cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt 
+0

아 .. 실제로,>은 PowerShell 연산자입니다. – alex2k8

1

나는 재와 함께 명령을 인코딩했다.

function Test 
{ 
    $cmd = { 5+7 } 
    $encodedCommand = EncodeCommand "$cmd > 'c:\log2.log'" 

    StartProcess "powershell -Command $cmd > c:\log.txt" 
    StartProcess "powershell -EncodedCommand $encodedCommand" 
} 

그래서이 C로 합계 5 + 7을 작성합니다 : \ log2.log

powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA 

P.S.

"cmd/c"를 사용하도록 제안 된 crb. 그러나이 경우 인코딩 된 스크립트의 길이는 8191 자 이상 마이크로 소프트 윈도우 XP 또는 명령 프롬프트에서 사용할 수있는 문자열의 최대 길이입니다 실행하는 컴퓨터에서 command line limitations

에 의해 제한됩니다. Microsoft Windows 2000 또는 Windows NT 4.0을 실행하는 컴퓨터의 경우 사용할 수있는 문자열의 길이는 최대 문자입니다.

2

두 명령의 차이점은 -Command 매개 변수가 유익하다는 것입니다. -EncodedCommand는 탐욕스럽지 않지만 명령 행에서 모든 것을 취합니다. 첫 번째 명령이 실제로 수행하는 작업은 다음과 같습니다.

powershell -Command "4+5 > c:\log.txt" 

따라서 새 PowerShell 인스턴스가 리디렉션을 처리하고 있습니다. 그러나 -EncodedCommand 매개 변수를 사용하는 경우 인코딩 된 명령에 포함하지 않았기 때문에 새 PowerShell 인스턴스에서 리디렉션을 볼 수 없습니다. PowerShell을 호출하는 환경에서 예약 된 작업과 같이 리디렉션이없는 경우이 작업이 좋지 않을 수 있습니다.

"crb"에서 보여 주듯이 명령에 리디렉션을 인코딩하거나 cmd 또는 다른 PowerShell 인스턴스와 같은 리디렉션을 처리 할 수있는 환경에서 PowerShell을 호출해야합니다.

+0

나는 이것을 이미했다. – alex2k8

+2

나는 이것이 왜 일어나고 있는지 설명하고 있었다. 나는 코드에서 버그를 수정하는 것이 아니라 그들이 일어난 이유를 이해하는 것이 중요하다고 생각한다. 때로는 다른 문제를 해결할 수있는 깔끔한 방법을 보여줄 수도 있습니다. – JasonMArcher

+0

쿨, 고맙습니다 제이슨! – alex2k8