Сохраняйте одинаковую кодировку с несколькими файлами содержимого в PowerShell - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь написать скрипт, который будет использоваться для переноса приложения с сервера на сервер и / или с одной буквы диска на другую.Моя цель - скопировать каталог из одного места, переместить его в другое, а затем запустить скрипт, чтобы отредактировать все экземпляры старого имени хоста, IP-адреса и буквы диска, чтобы отразить новое имя хоста, IP-адрес и букву диска нановый сервер.Похоже, это именно так:

ForEach($File in (Get-ChildItem $path\* -Include *.xml,*.config -Recurse)){
    (Get-Content $File.FullName -Raw) -replace [RegEx]::Escape($oldhost),$newhost `
                                 -replace [RegEx]::Escape($oldip),$newip `
                                 -replace "$olddriveletter(?=:\Application)",$newDriveLetter | 
     Set-Content $File.FullName -NoNewLine
}

Единственная проблема, с которой я столкнулся, заключается в том, что все файлы имеют разные типы кодирования.Какой-то ANSI, какой-то UTF-8, какой-то Unicode и т. Д. Когда я запускаю скрипт, он сохраняет все как ANSI, и тогда мое приложение не работает.Я знаю, как добавить параметр кодирования, но есть ли способ сохранить одинаковую кодировку для каждого отдельного файла, не выписывая сценарий, определяющий каждый отдельный файл в каталоге и кодировку, которую имеет каждый отдельный файл?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Это было бы сложно.Жаль, что get-content не передает свойство кодирования.Вот скрипт, который пытается получить кодировку, если есть подпись.Может быть, вы можете просто запустить его и проверить их все.Но некоторые файлы Windows не имеют кодировки Unicode.По крайней мере, XML-файлы могут сказать кодировку.get-childitem *.xml | select-string encoding Возможно, есть лучший способ загрузки XML-файлов, см. Нижний ответ: Powershell: настройка кодировки для конвейера Get-Content

# encoding.ps1
# /2745471/effektivnyi-sposob-naiti-kodirovku-lybogo-faila
param([Parameter(ValueFromPipeline=$True)] $filename)
process {
  $reader = [IO.StreamReader]::new($filename, [Text.Encoding]::default,$true)
  $peek = $reader.Peek()
  $encoding = $reader.currentencoding
  $reader.close()
  [pscustomobject]@{Name=split-path $filename -leaf
                BodyName=$encoding.BodyName
            EncodingName=$encoding.EncodingName}
}
# end encoding.ps1


PS C:\users\me> get-childitem chinese16.txt | encoding

Name          BodyName EncodingName
----          -------- ------------
chinese16.txt utf-16   Unicode

Примерно так будет использовать кодировкууказывается в файле XML, даже если он не соответствует заранее.(Это также делает xml красивым.)

PS C:\users\me> [xml]$xml = get-content file.xml
PS C:\users\me> $xml.save('file.xml')
0 голосов
/ 14 мая 2019

Используйте file.exe из двоичных файлов git, чтобы узнать кодировку. Затем добавьте параметр кодирования в строку set-content с помощью операторов if else для удовлетворения ваших потребностей.

ForEach($File in (Get-ChildItem $path\*)){
    $Content = Get-Content $File.FullName -Raw -replace [RegEx]::Escape($oldhost),$newhost `
                                 -replace [RegEx]::Escape($oldip),$newip `
                                 -replace "$olddriveletter(?=:\Application)",$newDriveLetter 
    $Encoding = file --mime-encoding $File
    $FullName = $File.FullName
    Write-Host "$FullName - $Encoding"
    if(-NOT ($Encoding -like "UTF")){
        Set-Content $Content -NoNewLine -Encoding UTF8
    }
    else {
        Set-Content $Content -NoNewLine 
    }
}

Ссылка: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content http://gnuwin32.sourceforge.net/packages/file.htm

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