2014-10-06 3 views
0

ifconfig.me에서 외부 IP를 가져 오는 기능이 있습니다. 그러나 그것은 자신이 제대로 파워 쉘에 의해 처리되는 방식으로 인코딩되지, "http://ifconfig.me/ip"문자열이 powershell에서 잘못 인코딩 됨

function Get-ExternalIP 
    { 
    $url = "http://ifconfig.me/ip" 
    $webClient = new-object System.Net.WebClient 
    $ip = $webClient.downloadstring($url) 
    return $ip 
    } 

이 성공적으로 IP 주소 모습을 반환에서 일반 문자열 모양을 반환합니다.

$ip = Get-ExternalIP 
$ip -as [ipaddress] 

실패합니다.

이 문자열로 수행하려고 시도하는 모든 함수가 실패합니다. 텍스트 파일에서 다른 IP를 문자열로 가져오고 두 개를 비교하는 것은 '동일'하더라도 실패합니다.

텍스트 파일에 쓰기를 시도 할 때 추가 줄 바꿈이 표시되고 16 진수 heditor가 표시되지 않는 추가 데이터로드를 표시하는 경우 악화됩니다.

enter image description here 위쪽은 '불량 데이터'이며, 아래는 내가 예상 한 모습의 예입니다.

나는 이것이 추출한 텍스트 객체의 인코딩으로 인한 것이라고 생각하지만, 인코딩이 무엇인지 알 수 있고 그것을 다시 인코딩 할 수있는 방법을 알고 싶습니다. 함께 일할 수 있습니다. 내가 할 수있는 간단한 캐스트 (?)가있을 것이라고 확신합니까? 그러나 나는 그것을 어떻게 찾아 낼지 모른다.

+1

은 "여분의"데이터 [바이트 순서 마크]이다 (http://en.wikipedia.org/wiki/Byte_order_mark). – vonPryz

+1

'$ ip.trim() -as [ipaddress]'는'TRUE'를 리턴합니다! 이 값에는 마지막에 여분의 '빈'칸이 있습니다. –

+0

@vonPryz 문자열의 시작 부분에있는 두 문자는 BOM이지만 데이터의 ret를 보면 여분의 문자가 있습니다. – Patrick

답변

0

문제는 웹 사이트에서 반환 한 문자열의 후행 줄 바꿈 때문에 발생합니다. IP 주소 후 닫는 큰 따옴표 오류 메시지에서 다음 줄에 있는지

PS C:\>$ip = Get-ExternalIP 
PS C:\>$ip 
192.168.23.42 

PS C:\>$ip -as [ipaddress] 
PS C:\>[ipaddress]$ip 
Cannot convert value "192.168.23.42 
" to type "System.Net.IPAddress". Error: "An invalid IP address was specified." 
At line:1 char:1 
+ [ipaddress]$ip 
+ ~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [], RuntimeException 
    + FullyQualifiedErrorId : InvalidCastParseTargetInvocation

참고 : 대신 -as 연산자를 사용하는 [ipaddress]에 문자열을 캐스팅 할 때 오류가 분명해집니다.

Trim() 문자열을 반환 전에 문제가 사라질 것이다

function Get-ExternalIP { 
    $url = "http://ifconfig.me/ip" 
    $webClient = new-object System.Net.WebClient 
    $ip = $webClient.downloadstring($url) 
    return $ip.Trim() 
} 
+0

나는 이미 .trim()을 시도했지만,이 함수의 버전을 테스트했고 이번에는 제대로 작동했음을 알릴 수 있었다. 당신의 도움을 주셔서 감사합니다. – Patrick

1

나는 참고로, 귀하는 test.txt 이미지가 유니 코드 형식의 가능성이 텍스트 출력 형식

$ip = "255.255.255.255" 
$ip | out-file -encoding ascii -Filepath C:\ascii_ip.txt 

위해 ASCII를 사용할 수 있습니다. 이것과 비교해 보면 알 수 있습니다. 비밀은 텍스트 파일의 파일 헤더와 같은 BOM (바이트 순서 표시) "FF FE"에 있습니다.

$ip | out-file -encoding unicode -Filepath C:\unicode_ip.txt 
+0

당신은 두 답을 모두 옳다고 표시하고 싶었지만 @ Ansgar의 답변은 가장 성가신 문제를 해결했지만, 당신의 대답도 매우 도움이되었습니다. 감사합니다. – Patrick

관련 문제