เก็บการเข้ารหัสแบบเดียวกันด้วยชุดเนื้อหาหลายไฟล์ใน PowerShell

ฉันกำลังพยายามเขียนสคริปต์เพื่อใช้ในการย้ายแอปพลิเคชันจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งและ/หรือจากอักษรระบุไดรฟ์หนึ่งไปยังอักษรระบุไดรฟ์อื่น เป้าหมายของฉันคือการคัดลอกไดเรกทอรีจากที่หนึ่ง ย้ายไปยังอีกที่หนึ่ง จากนั้นเรียกใช้สคริปต์เพื่อแก้ไขอินสแตนซ์ทั้งหมดของชื่อโฮสต์เก่า ที่อยู่ 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 จากนั้นแอปพลิเคชันของฉันก็ไม่ทำงาน ฉันรู้วิธีเพิ่มพารามิเตอร์การเข้ารหัส แต่มีวิธีใดบ้างที่จะรักษาการเข้ารหัสเดียวกันในแต่ละไฟล์ โดยไม่ต้องเขียนสคริปต์ที่ระบุแต่ละไฟล์ในไดเร็กทอรีและการเข้ารหัสที่แต่ละไฟล์มี


person Christopher Cass    schedule 14.05.2019    source แหล่งที่มา
comment
ดูเหมือนคุณจะใช้คำว่าการเข้ารหัสเมื่อคุณหมายถึงการเข้ารหัส ความแตกต่างค่อนข้างสำคัญ ดังนั้นหากเป็นเช่นนั้น ฉันขอแนะนำให้คุณแก้ไขคำถามเพื่อสะท้อนถึงสิ่งนั้น   -  person Jeroen Mostert    schedule 14.05.2019
comment
คุณถูก. ฉันกำลังทำโปรเจ็กต์อื่นในเวลาเดียวกันเพื่อจัดการกับการเข้ารหัส และฉันก็สับสนไปหมด   -  person Christopher Cass    schedule 14.05.2019


คำตอบ (2)


นั่นคงเป็นเรื่องยาก น่าเสียดายที่ get-content ไม่ผ่านคุณสมบัติการเข้ารหัส นี่คือสคริปต์ที่พยายามรับการเข้ารหัสหากมีลายเซ็น บางทีคุณอาจเรียกใช้มันก่อนแล้วตรวจสอบทั้งหมดได้ แต่ไฟล์ windows บางไฟล์เป็น unicode no bom ไฟล์ xml อย่างน้อยสามารถระบุการเข้ารหัสได้ get-childitem *.xml | select-string encoding อาจมีวิธีที่ดีกว่าในการโหลดไฟล์ xml ดูคำตอบด้านล่าง: Powershell : การตั้งค่าการเข้ารหัสสำหรับไปป์ไลน์รับเนื้อหา

# encoding.ps1
# https://stackoverflow.com/questions/3825390/effective-way-to-find-any-files-encoding
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("$pwd\file.xml")
person js2010    schedule 14.05.2019
comment
วิธีแก้ไขปัญหานั้นใช้ไม่ได้กับไฟล์ ansii ของฉัน แต่ใช้งานได้ดีเป็นพื้นฐานเมื่อใช้ร่วมกับส่วนต่าง ๆ ของโซลูชันนี้: community.idera.com/database-tools/powershell/powertips/b/tips/ ดังนั้นขอขอบคุณสำหรับคำตอบและบางทีลิงก์นี้อาจเป็น เป็นประโยชน์สำหรับผู้อื่น - person Jan; 13.08.2020

ใช้ 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

person Richard Hughes    schedule 14.05.2019
comment
โปรดอ่านคำถามอีกครั้ง โดยเฉพาะประโยคสุดท้าย - person Jeroen Mostert; 14.05.2019