2015-11-17 3 views
4

У меня возникли проблемы с редактированием файла. Это файл .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 

Не совсем уверен, кто должен опубликовать, чтобы получить решенную кредит, но спасибо всем

+4

То, что вы могли бы видеть, что исходный файл имеет односимвольные переносы строк (перевода строки/новая строка символов) в то время как 'Set-Content' использует двухсимвольные строки (возврат каретки + перевод строки) при записи файла –

+0

Это относится и к Out-File? – TetraFlash

+0

@TetraFlash да, но. Это связано с тем, как вы читаете файл и затем записываете его (по очереди). Возможно, вы сможете использовать '[System.IO.File] :: ReadAllText()', а затем ':: WriteAllText()'. – briantist

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^