문제

내가 만드는 Powershell 스크립트는 배포하는 코드 및 프로세스의 일부를 호출하는 명령줄 압축 라는 도구 RAR.EXE 백업부는 폴더.

내가 하려고 동적으로 구축하는 매개변수와 그 powershell 전화를 명령을 가진 변수가 있지만 난로 실행 문제입니다.그것은 작동하지 않...

다음 스크립트를 실행해야 한다 내가 무엇에 대해 얘기하는 거에요.매개변수에 전달되는 변수로는 것이 알아보지 못하도록 변경됩니다.에 통과할 경우 전체 명령 매개변수에서 나는 악명 높은"로 인식되지 않 cmdlet..."메시지가 표시됩니다.

어떤 도움을 주셔서 감사합니다!

echo "this should succeed"
& cmd /c echo foo

echo "why does this echo out an additional double quote?"
$param = "/c echo foo"
& cmd "$param"

echo "this does the same"
$param = "/c echo foo"
& cmd $param

echo "escaping the slash doesn't work either..."
$param = "`/c echo foo"
& cmd $param

echo "this fails, but why?"
$cmd = "cmd /c echo foo"
&$cmd
도움이 되었습니까?

해결책

전화 operator'&'불필요한 경우에.그것은 사용되는 명령을 호출에 새로운 범위가 있습니다.이것은 일반적으로 사용되는 명령을 호출에 의해 지정된 문자열 또는 스크립트 블록.그것은 또한 측면 혜택 있는 모든 변수에서 만든 말 PowerShell 스크립트는 폐기 명령이 완료되면 및 범위는 예입니다.

그러나 그 이후 cmd EXE 그것을 실행합에서 완전히 다른 프로세스.FWIW,당신은 유사한 출력에서 직접 cmd.exe:

> cmd "/c echo foo"
foo"

그래서 견적서 결국 cmd.exe 문제입니다.일반적으로 필요하신 명령에서 별도의 매개변수를 할 때 PowerShell 을 분석하는 명령을 호출 예:

45> & { $foo = "foo" }
46> $foo  # Note that $foo wasn't found - it went away with the scope
47> . { $foo = "foo" } # dotting executes in the current scope
48> $foo 
foo

주목할 만한 예외 여기에 호출하는 표현처럼 행동하는"평가 이 문자열"기능이 있습니다.치료와 함께 사용, 특히 는 경우 사용자가 제공하는 문자열.하루 빨 수 있는 경우에 그들이 제공하는"ri C: ".

이 경우에는,다른 사람으로 제안 나는 끌어/c 의 문자열$매개 변수 문자열을 지정하고 그것은 예를 들어:

cmd /c $param

또는 사용 Invoke-식 하지만 치료와 함께 사용합니다.이 때 당신이 시도하고 있는 문제를 디버깅을 보내는 함께 인수를 EXE 에서 PowerShell,확인 echoargs 유틸리티에서 PowerShell 커뮤니티 확장자(http://pscx.codeplex.com).그것은 매우 편리:

49> $param = "/c echo foo"
50> echoargs $param
Arg 0 is </c echo foo>

이 cmd.exe 을 받"/c echo foo"로 단일 다."/c"해야한 별도의 인수에서"echo foo"(명령을 실행).

다른 팁

내가 문제가 및 운영자 과거에 시도할 때 호출에 실행 유형 같은 명령어 당신은 노력하고 있습니다.지 나는 이유를 이해합니다.Invoke-식 그러나,항상에서 작동하는 것 같이 context:

PS C:\> $cmd = "cmd /c echo foo"
PS C:\> Invoke-expression $cmd
foo

다른 하나의 방법을 발견 할 일이었을 만들의 배열에 대한 인수 명령 라인에 사용하는 apersand&화 연산자입니다.무언가 이것을 좋아한다:

$exe = "cmd";
[Array]$params = "/c", "echo", "foo";

& $exe $params;

그것은 잘했습니다.

내가 원래 이 기술은 여기:http://techstumbler.blogspot.com/2009/12/windows-commands-with-arguments-in.html

당신의 마지막 예는 경우에 못하기 때문에"&"취급 문자열로 인수,그래서 그것은 프로그램을 찾고 이름이"cmd/c echo foo.exe".:)

이동:

& $cmd $params

로에 대한 따옴표 문제,그것은 보인다는 cmd 를 좋아하지 않는 따옴표로 묶는 인수 PowerShell 둔다.그것을 얻는다:

cmd "/c echo foo"

그래서 나는 그것을 취급 후 모든 것/c 으로 정확한 그 명령과 같이:

echo foo"

명령행 프로그램과 펑키한 구문 분석의 명령 라인(는 이유 PowerShell 이상 걸립니 이 일에 대한 기능과 cmdlet).의 경우에 cmd,I would suggest this:

$param = "echo foo"
& cmd /c $param

그것은 유물을 사용하 cmd/c,나는 생각한다.실행

$param = "echo foo"
cmd /c $param

잘 작동합니다.지 않으면 당신은 실제 코드를 들어,그것은 약간의 하드하는 문제 촬영합니다.

Args 는 다르게 처리할 때 문자열에 포함된:

PS D:\> echo "1 2 3"
1 2 3
PS D:\> echo 1 2 3
1
2
3

같은 결과가 발생할 때 사용할 변수를 위한 args:

PS D:\> $param = "1 2 3"
PS D:\> echo $param
1 2 3

이 솔루션은 배열을 사용:

PS D:\> $param = @(1,2,3)
PS D:\> echo $param
1
2
3
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top