在PowerShell中编码的字符串不正确

时间:2014-10-06 11:13:05

标签: powershell text character-encoding

我有一个从ifconfig.me获取外部IP的功能。它从" http://ifconfig.me/ip"

返回看起来像普通字符串的内容
function Get-ExternalIP
    {
    $url = "http://ifconfig.me/ip"
    $webClient = new-object System.Net.WebClient 
    $ip = $webClient.downloadstring($url)
    return $ip
    }

这会成功返回看起来像IP地址的内容,但是它的编码方式不是由PowerShell正确处理的。

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

失败。

我尝试对此字符串执行的所有功能都失败了。我将一个不同的IP作为字符串从文本文件中导入,并比较两者即使它们是相同的也是失败的。

情况变得更糟,当我尝试将其写入文本文件时,我获得了额外的换行符,而十六进制的heditor显示了大量未显示的额外数据。

enter image description here Top是“坏数据”,底部是我期望它看起来的一个例子。

我假设这是由于我提取的文本对象的编码,但我想了解我如何找出编码是什么并重新编码以一种我可以使用的方式。我确定有一个简单的演员(?)我能做到吗?但我不知道如何找到它。

2 个答案:

答案 0 :(得分:1)

我会使用ASCII作为文本输出格式

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

fyi,您的test.txt图片很可能是unicode格式。与此相比,你会看到。秘密在BOM(字节顺序标记)" FF FE"这就像文本文件的文件头。

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

答案 1 :(得分:0)

您的问题是由网站返回的字符串中的尾随换行引起的。将字符串转换为[ipaddress]而不是使用-as运算符时,错误会变得明显:

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

请注意,IP地址后面的结束双引号位于错误消息的下一行。

返回之前

Trim()字符串,问题就会消失:

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