Конвертировать файл из Windows в UNIX через Powershell или Batch - PullRequest
5 голосов
/ 13 января 2012

У меня есть пакетный скрипт, который запрашивает ввод данных пользователем, а затем выводит пару файлов, которые я использую в среде AIX. Эти файлы должны быть в формате UNIX (я полагаю, это UTF8), но я ищу какое-то направление в простейшем способе сделать это.

Мне не нравится загружать дополнительные пакеты программного обеспечения; Cygwin или GnuWin32. Я не против написать это, если это возможно, я могу выбрать Batch, Powershell и VBS. Кто-нибудь знает способ сделать это?

Или я могу создать файлы с помощью Batch и вызвать скрипт Powershell для их исправления?

Идея в том, что пользователю будет предложено ввести некоторую информацию, а затем я выведу стандартный файл, который в основном представляет собой быстрый ответ в AIX для задания. Сначала я использую Batch, потому что я не знал, что столкнусь с этой проблемой, но я склоняюсь к тому, чтобы исправить это в Powershell. потому что я нашел код на другом форуме, который может выполнить преобразование (ниже).

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

Ищем какое-то направление или какой-то вклад в это.

Ответы [ 2 ]

15 голосов
/ 13 января 2012

Вы не можете сделать это без внешних инструментов в пакетных файлах.

Если все, что вам нужно, это кодировка файла, то предоставленный вами фрагмент должен работать. Если вы хотите конвертировать файлы в файл (вместо записи их в другое место), вы можете сделать

Get-ChildItem *.txt | ForEach-Object { (Get-Content $_) | Out-File -Encoding UTF8 $_ }

(круглые скобки вокруг Get-Content важны). Тем не менее, при запуске будут записаны файлы в UTF-8 с подписью (U + FEFF), которую некоторые инструменты Unix не принимают (даже если это технически допустимо, хотя не рекомендуется использовать).

Тогда есть проблема, что разрывы строк различны в Windows и Unix. Unix использует только U + 000A (LF), в то время как Windows использует для этого два символа: U + 000D U + 000A (CR + LF). Так что в идеале вы также должны преобразовывать разрывы строк. Но это становится немного сложнее:

Get-ChildItem *.txt | ForEach-Object {
  # get the contents and replace line breaks by U+000A
  $contents = [IO.File]::ReadAllText($_) -replace "`r`n?", "`n"
  # create UTF-8 encoding without signature
  $utf8 = New-Object System.Text.UTF8Encoding $false
  # write the text back
  [IO.File]::WriteAllText($_, $contents, $utf8)
}
0 голосов
/ 28 декабря 2016

Попробуйте перегруженную версию ReadAllText (String, Encoding), если вы используете символы ANSI, а не только символы ASCII.

$contents = [IO.File]::ReadAllText($_, [Text.Encoding]::Default) -replace "`r`n", "`n"

https://msdn.microsoft.com/en-us/library/system.io.file.readalltext(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
ASCII - получает кодировку для набора символов ASCII (7 бит).
По умолчанию - получает кодировку для текущей кодовой страницы ANSI операционной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...