我正试图编写一个PS脚本,为Rocket Software的SBClient构建并执行脚本文件。脚本语言使用两个不同的分隔符,þ(小写thorn)(0xFE)和ü(u带元音变音符)(0xFC)。
其中每一个都以两个字符的形式写入文件。þ被写成â¾(带波浪号和3/4的A)(0xC3 0xBE)。ü被写成¼(带波浪号和1/4的A)(0xC3 0xBC)。
我尝试了多种不同的方法来编写文件,每次都会以相同的方式出现。我确信这是因为这些是扩展的ASCII字符。
有没有一种方法可以用正确的两个字符的十六进制代码将这些字符串写入文本文件,而无需将字符串转换为十六进制并写入二进制文件?如果没有,将字符串转换为十六进制的最佳方法是什么?我在其他语言中看到了一些不同的例子,但在PS中没有真正的例子。
看起来我可以将字符串转换为字节数组,然后使用io.file::WriteAllBytes()
写入文件。我只是希望有更好的方法。
这是相关的代码。。。
$ScriptFileContent = 'TUSCRIPTþþþ[Company Name] Logon Please:þ{enter}üPST{enter}þ2þ'
$ScriptFilePath = ([Environment]::GetFolderPath("ApplicationData")).ToString() + "Rocket SoftwareSBClienttuscriptNT"
out-file -filepath $ScriptFilePath -inputobject $ScriptFileContent -encoding ascii
解决方案
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$ScriptFileContent = 'TUSCRIPTþþþ[Company Name] Logon Please:þ{enter}üPST{enter}þ2þ'
$ScriptFileContent = $enc.GetBytes($ScriptFileContent)
$ScriptFilePath = ([Environment]::GetFolderPath("ApplicationData")).ToString() + "Rocket SoftwareSBClienttuscriptNT"
[io.file]::WriteAllBytes($ScriptFilePath, $ScriptFileContent)
谢谢你的帮助!
您看到的是ASCII之外的字符,编码为UTF-8。这里有两个选择:
- 使用
[System.Text.Encoding]::GetEncoding("iso-8859-1")
将文件写入Latin1 - 或者您使用
io.file.Open
的结果的FileStream.WriteByte()
方法直接自己写入0xFE
和0xFC
字节(似乎没有那么过分,但这取决于您如何写入其余数据)