PowerShell写入TXT的IP无法被批处理读取 手动创建文件读取正常
问题原因
- 编码不兼容是核心诱因:PowerShell 内置的
Out-File命令默认输出编码为 UTF-16 LE(Unicode编码),而批处理的For /F读取命令默认仅支持ANSI、UTF-8无BOM编码的文本,无法正确解析UTF-16格式的内容,导致IP读取失败、变量k未被赋值,执行echo %k%时就会输出无参数的echo命令反馈ECHO is on. - 手动创建的TXT文件默认是ANSI编码,所以批处理可以正常读取。
解决方案
方案1:修改PowerShell写入编码(推荐,改后无需调整批处理代码)
只需要在原有PowerShell的Out-File命令后追加编码参数-Encoding Default即可,该参数指定输出编码为系统默认ANSI编码,和手动新建TXT的编码完全一致:
$Line = Invoke-RestMethod -Uri "http://ipinfo.io" | select-object -property ip ($Line | Select-String -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.Value | Out-File -FilePath C:\src\Newfolder\currentip.txt -Encoding Default
也可以使用更简洁的写法,直接提取IP并写入:
(Invoke-RestMethod -Uri "http://ipinfo.io").ip | Set-Content -Path C:\src\Newfolder\currentip.txt
Set-Content默认编码就是ANSI,无需额外指定参数。
方案2:修改批处理代码适配现有编码
如果不想修改PowerShell代码,可以在批处理开头切换代码页为UTF-16 LE对应编码1200:
chcp 1200 >nul For /F UseBackQ^ Delims^=^ EOL^= %%G In ("C:\src\Newfolder\currentip.txt") Do Set "k=%%G" echo %k% pause
注意:切换代码页为1200后,批处理后续的中文输出可能会出现乱码,仅推荐不需要输出中文的场景使用。
内容的提问来源于stack exchange,提问作者Nafi
相关产品推荐
相关产品推荐

