2015-01-12 5 views
0

"wget"post 명령을 perl 스크립트에서 실행하려고합니다. Windows 7 컴퓨터에서 strawberry perl을 사용하고 있습니다. post 매개 변수에는 앰퍼샌드 (&) 문자가 포함되어 있으며 백틱 내부에서 wget을 실행하면 앰퍼샌드가 백그라운드에서 실행되기 전에 모든 것을 원할 경우 앰퍼샌드가 명령의 끝처럼 처리됩니다. 나는 앰퍼샌드를 제대로 벗어나려고 몇 가지 방법을 시도했다. 그러나 나는 아이디어가 부족합니다.Strawberry perl : 백틱 명령에서 앰퍼샌드를 배경이 아닌 매개 변수로 사용해야합니다.

그래서, 내가 실행하는 데 노력하고있어 명령은 같은입니다

$wget = "/c/workarea/wget/bin/wget"; 
$value1 = 1; 
$groupName = "group1"; 
$output = `$wget --post-data 'Field1=${value1}&Field2=Val2&Field3=${groupName}' "http://localhost/LocalPage"`; 

다음과 같은 IT 것은 잘 작동처럼은 bash는 명령 행에서 명령을 실행하는 경우 :

/c/workarea/wget/bin/wget --post-data 'Field1=1&Field2=Val2&Field3=group1' "http://localhost/LocalPage" 

하지만 perl 스크립트에서 실행할 때 다음과 같은 오류가 발생합니다.

'Field2'는 내부 또는 외부 명령으로 인식되지 않습니다. 작동 가능한 프로그램 또는 박쥐 ch 파일.

'Field3'이 (가) 내부 또는 외부 명령 인 작동 가능 프로그램 또는 배치 파일로 인식되지 않습니다.

큰 따옴표 안에있는 모든 내용이 해석되지 않는다고 알리는 제안을 발견했기 때문에 큰 따옴표 안에 작은 따옴표로 묶인 명령의 전체 "게시"부분을 넣었습니다. "&"을 "백그라운드에서 실행"문자로 취급하지 않는 명령이 실행되는 동안 작동하는 것으로 보입니다. 그러나 결과로 실행되는 명령은 내가 원하는 것을 수행하지 않습니다. 위와 같은 명령을 명령 줄에서 실행할 때처럼 POST가 perl 스크립트에서 게시하지 않는다는 것을 의미합니다. 나는 '&'문자를 단일 '\'및 이중 '\'문자를 사용하여 이스케이프 처리하려고 시도했습니다. 문자열이 전달 될 때 이스케이프가 여러 번 발생해야 할 수도 있습니다. 나는 '\\'으로 시도해 보았다. 그러나, 그것은 아무런 영향을 미치지 않는 것 같습니다.

나중에 스크립트에서 나중에 의사 결정을 위해 명령 출력을 구문 분석 할 수 있도록 백틱을 사용하고 싶습니다. 그래서, 나는 '시스템'대신 '백틱'이 필요하다고 생각합니다.

적절한 처리를 위해 어떻게 탈출하거나 인용해야하는지에 대한 도움을 미리 감사드립니다. 또는 해석 된 후 백틱 내부에서 시도되는 것을 볼 수있는 방법이 있다면 실행될 쉘로 전달됩니다. 내가 그것을 안다면 나는 내가 뭘 잘못하고 있는지 더 잘 말할 수있을 것 같아.

감사합니다, sjmyst

답변

0

글쎄, 내가 출력 매개 변수를 스크립트를 작성하여 파악하는 방법을 알아 냈어. 그럼, 내가 한 것은 다음과 같은 스크립트를 작성했고 그것을 이름 test.pl :

다음
#!/usr/bin/env perl.exe 

print "ENTERING test.pl...\n"; 

$i = 0; 
foreach my $arg (@ARGV) { 
    print "i = $i\n"; 
    print "ARGV[$i] = $ARGV[$i]\n"; 
    $i = $i + 1; 
} 

대신 위의 같은 매개 변수 '은 wget'호출, 나는 test.pl 내가했던 매개 변수를 전달라는 'wget'에 전달됩니다. 그런 다음 백틱의 셸이 POST 인수를 해석하여 'wget'에 전달한 후 'wget'이 무엇을 볼 수 있는지 확인할 수있었습니다. 나는 아마 그것을 게시하기 전에 알아 내야했다. 다행히도 이것은 나 같은 초보자가 도망가는 문제를 파악하는 데 도움이 될 수 있습니다.그래서, 다음과 같은 것 :

$wget = "/c/workarea/wget/bin/wget"; 
$value1 = 1; 
$groupName = "group1"; 
# Wasn't working 
#$output = `$wget --post-data 'Field1=${value1}&Field2=Val2&Field3=${groupName}' "http://localhost/LocalPage"`; 
# Eventually got working by seeing what was passed into test.pl 
$output = `test.pl --post-data "Field1=${value1}&Field2=Val2&Field3=${groupName}" \"http://localhost/LocalPage\"`; 

결론은 POST 매개 변수 주위에 이중 따옴표 만 필요하다는 것이 었습니다. 그래서 큰 따옴표 만 포함하고 작은 따옴표는 모두 제거했습니다. 이것은 '&'을 "백그라운드에서 실행"문자로 처리하는 백틱 쉘이없는 하나의 매개 변수로서 'wget'에 문자열을 그대로 전달했습니다.

감사합니다,

sjmyst