У меня возникли проблемы с редактированием файла. Это файл .ARQ от BMC Remedy, системы продажи билетов.Powershell Remedy ARQ-файлы, возможная проблема с кодированием
Я могу открыть его в блокноте ++, отредактировать его, и все в порядке. Однако, когда я пытаюсь использовать PowerShell для его редактирования, все становится беспорядочным. Хотя визуально это выглядит одинаково, приложение не читает его таким же образом. Вот некоторые тесты, которые я сделал, чтобы попытаться выяснить, что не так.
Test 1
get-content monitor.arq | set-content monitor2.arq
Результат
Length Name
------ ----
3578 monitor.arq
3585 monitor2.arq
В основном они имеют разные размеры, и 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"
}
Результат
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
Ни один кажется правильным, может быть, я ложному здесь дерево, но есть простой текст в этом файле я хочу изменить, не нарушая все это.
Я также пробовал поток файлов (много кода, не включая), но он дал те же результаты.
По блокноту ++ его 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
В результате этого мне показывает, что символы преобразуются таким образом, я не хочу.
InputObject SideIndicator
----------- -------------
63 =>
63 =>
63 =>
63 =>
13 =>
10 =>
201 <=
233 <=
233 <=
201 <=
13-и 10 я знаю, являются разрывы строк, обсуждавшиеся в комментариях, они добавляются в конец файла, честно, я не думаю, что это влияет на что-нибудь в этот момент, потому что он появляется после END (это файл макроса для устранения BMC)
Мое беспокойство заключается в том, что 201 и 233 преобразуются в 63. Любые мысли о том, как остановить это? Я собирался просто преобразовать обратно в байт [] перед записью файла, но в тот момент я не смогу сказать, разница между 63-х годов, который должен быть 201 и те, которые должны быть 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
Не совсем уверен, кто должен опубликовать, чтобы получить решенную кредит, но спасибо всем
То, что вы могли бы видеть, что исходный файл имеет односимвольные переносы строк (перевода строки/новая строка символов) в то время как 'Set-Content' использует двухсимвольные строки (возврат каретки + перевод строки) при записи файла –
Это относится и к Out-File? – TetraFlash
@TetraFlash да, но. Это связано с тем, как вы читаете файл и затем записываете его (по очереди). Возможно, вы сможете использовать '[System.IO.File] :: ReadAllText()', а затем ':: WriteAllText()'. – briantist