Powershell -Encoding UTF8

时间:2015-12-30 17:00:54

标签: powershell utf-8

我有一个脚本可以更改备份.txt文件并保存一个新的.txt,我可以使用它来上传到Cisco Web界面。使用我的原始脚本,我会收到一个错误:

  

上传的文件无效。

这是原始剧本:

$name = Read-Host 'What is the SX20 name?'
if ($name -notlike "SX20NAME[a-z , 0-9]*")
    {
        Read-Host 'Please begin naming conventions with "SX20NAME".'
        }
        else {
        $description = Read-Host 'What is the SX20 alias?'
        (Get-Content C:\Users\SX20_Backup.txt)|

Foreach-Object {$_-replace 'SX20NAME[a-z , 0-9]*' , $name}|
Foreach-Object {$_-replace 'SetAlias' , $description}|

Out-file $env:USERPROFILE\Desktop\$name.txt}

我将-Encoding UTF8添加到Out-File中,现在它看起来像这样:Out-file $env:USERPROFILE\Desktop\$name.txt -Encoding UTF8}。所以现在接口将接受该文件,但是我收到一条新的错误消息:

  

有些命令遭到拒绝:卷:“50”

“Volume”恰好是备份文件中的第一行。我可以调整什么来解决这个问题?

1 个答案:

答案 0 :(得分:2)

问题是它使用带有BOM 的UTF-8 ,所以用零填充 adds some extra characters at the beginning (most likely 0xFFFE)。如果您在十六进制编辑器中打开文件,则可以看到此操作。

我之前使用Powershell遇到过这个问题,不幸的是,修复工作并不是很好。 This answer给出了正确的公式。

编辑:更适合您的代码,我认为这样可行。注意我使用%别名代替ForEach-Object(它们是相同的)。

$name = Read-Host 'What is the SX20 name?'

if ($name -notlike "SX20NAME[a-z0-9]*") {
    Read-Host 'Please begin naming conventions with "SX20NAME".'
} else {
    $description = Read-Host 'What is the SX20 alias?'
    $newContent = (Get-Content C:\Users\SX20_Backup.txt) | %{ $_ -replace 'SX20NAME[a-z,0-9]*', $name } | %{$_ -replace 'SetAlias', $description}
    $filename = $env:USERPROFILE\Desktop\$name.txt
    [IO.File]::WriteAllLines($filename, $newContent)
}