Powershell Remedy ARQ 文件,可能存在编码问题

Tet*_*ash 5 powershell encoding powershell-2.0 remedy

我在编辑文件时遇到问题。它是由票务系统 BMC Remedy 制作的 .ARQ 文件。

我可以在记事本++中打开它,编辑它,一切都很好。但是,当我尝试使用 PowerShell 对其进行编辑时,事情变得一团糟。尽管在视觉上看起来相同,但应用程序的读取方式不同。以下是我所做的一些测试,试图找出问题所在。

测试 1

get-content monitor.arq | set-content monitor2.arq
Run Code Online (Sandbox Code Playgroud)

结果

Length Name
------ ----
  3578 monitor.arq
  3585 monitor2.arq 
Run Code Online (Sandbox Code Playgroud)

基本上它们的大小不同,并且 monitor2.arq 的功能不像 monitor.arq 那样,在记事本++中视觉上它们是相同的

测试 2

我想可能是编码问题,所以我尝试了这个。

$code = @("Unicode", "UTF7", "UTF8", "UTF32", "ASCII", "BigEndianUnicode", "Default", "OEM")
for ($a = 0; $a -lt $code.count; $a++) {
    Get-Content .\monitor.arq | Out-File -Encoding $code[$a] -FilePath ".\monitor$a-$($code[$a]).arq"
}
Run Code Online (Sandbox Code Playgroud)

结果

Length Name                         
------ ----                         
  3578 monitor.arq                  
  7172 monitor0-Unicode.arq         
  4911 monitor1-UTF7.arq            
  3596 monitor2-UTF8.arq            
 14344 monitor3-UTF32.arq           
  3585 monitor4-ASCII.arq           
  7172 monitor5-BigEndianUnicode.arq
  3585 monitor6-Default.arq         
  3585 monitor7-OEM.arq  
Run Code Online (Sandbox Code Playgroud)

没有一个看起来是正确的,也许我在这里吠错了树,但是这个文件中有纯文本我想在不破坏整个事情的情况下进行编辑。

我还尝试了一个文件流(很多代码,没有包括)但它产生了相同的结果。

根据记事本++它的ANSI

根据我在网上找到的一些脚本来检查,它的 ASCII

我可能正在做一些完全愚蠢的事情,或者对此没有足够的了解来完成工作。

任何帮助都会很棒。

在评论的帮助下进行测试(感谢女士们和男士们)

$content1=gc -Encoding byte monitor.arq
[System.Text.Encoding]::ASCII.GetString($content1) | out-file -Encoding ascii -FilePath .\monitor2.arq
$content2=gc -Encoding byte monitor2.arq
Compare-Object $content1 $content2
Run Code Online (Sandbox Code Playgroud)

这样做的结果向我展示了哪些字符正在以我不想要的方式进行转换。

InputObject SideIndicator
----------- -------------
         63 =>           
         63 =>           
         63 =>           
         63 =>           
         13 =>           
         10 =>           
        201 <=           
        233 <=           
        233 <=           
        201 <=           
Run Code Online (Sandbox Code Playgroud)

我知道的 13 和 10 是评论中讨论的换行符,它们被添加到文件的末尾,老实说,我认为此时不会影响任何东西,因为它出现在 END 语句之后(这是一个宏文件BMC 补救措施)

然而,我担心的是 201 和 233 正在转换为 63。关于如何阻止它的任何想法?在写入文件之前,我将简单地转换回字节 [],但那时我将无法区分 63 和 203 之间的区别。

解决了

所以在评论中每个人的帮助下,我找到了一个解决方案。我自己对 ASCII 的无情固执以及评论中提到的换行符让我陷入了困境。

$content1=gc -Encoding byte monitor.arq
[System.Text.Encoding]::default.GetString($content1) | out-file -Encoding default -FilePath .\monitor2.arq
$content2=gc -Encoding byte monitor2.arq
Compare-Object $content1 $content2 | format-table -AutoSize
Run Code Online (Sandbox Code Playgroud)

不确定谁应该发布以获得解决的信用,但谢谢大家

Tet*_*ash 0

$content1=gc -Encoding byte monitor.arq
[System.Text.Encoding]::default.GetString($content1) | out-file -Encoding default -FilePath .\monitor2.arq
$content2=gc -Encoding byte monitor2.arq
Compare-Object $content1 $content2 | format-table -AutoSize
Run Code Online (Sandbox Code Playgroud)