ไวยากรณ์ที่เหมาะสมสำหรับการแทนที่หลายสตริงใน Powershell

เรามีไดเร็กทอรีไฟล์ HTML มากกว่า 3,000 ไฟล์ที่กำลังย้ายไปยังไซต์ sharepoint และเราจำเป็นต้องขัดข้อมูลบางส่วน

สถานการณ์เฉพาะ:

  • ประมาณ 1/3 ของไฟล์มีส่วนหัว XML <?xml version="1.0" encoding="utf-8"?> ที่ sharepoint ไม่ชอบ เราวางแผนที่จะลบบรรทัดส่วนหัวนั้นออก
  • ทุกไฟล์มีพารามิเตอร์จาวาสคริปต์สำหรับ "HOME" ซึ่งชี้ไปที่ลิงก์หน้าแรกที่เกี่ยวข้องอื่นสองลิงก์ foo1.htm หรือ foo.htm เราต้องการเปลี่ยนทั้งคู่เป็นลิงก์สัมบูรณ์ของ http:\\sharepoint.site\home.aspx
  • ทุกไฟล์ยังมีพารามิเตอร์ลิงก์จาวาสคริปต์ "แสดง" ซึ่งเราเพียงต้องการซ่อนโดยเปลี่ยนเป็น ''

นี่คือฟังก์ชั่นของฉันจนถึงตอนนี้:

function scrubXMLHeader {
    $srcfiles     = Get-ChildItem $backupGuidePath -filter "*htm.*"                              
    $srcfilecount = (Get-ChildItem $backupGuidePath).Count                                       
    $selfilecount = $srcfiles.Count                                                              
    # Input and Ouput Path variables
    $sourcePath        = $backupGuidePath 
    $destinationPath   = $workScrubPath
    "Input From: $($sourcePath)" | Log $messagLog -echo          
    " Output To: $($destinationPath)" | Log $messageLog -echo
    #
    $temp01 = Get-ChildItem $sourcePath -filter "*.htm"
    foreach($file in $temp01)
    {
        $outfile = $destinationPath + $file
        $content = Get-Content $file.Fullname | ? {$_ -notmatch "<\?xml[^>]+>" } 
        Set-Content -path $outfile -Force -Value $content
    }
}

ฉันต้องการเพิ่มการแก้ไขสองรายการต่อไปนี้ในแต่ละเอกสาร:

-replace '("foo.htm", "", ">", "Home", "foo1.htm")', '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx")
-replace 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");', ''

ฉันไม่แน่ใจว่าจะรวมสิ่งเหล่านั้นเป็นคำสั่งเดียวได้อย่างไร ดังนั้นฉันจึงเปิดไฟล์ ทำการเปลี่ยนแปลง บันทึกและปิดไฟล์แทนการทำธุรกรรมเปิด-แก้ไข-บันทึก/ปิดแยกกันสามรายการ ฉันยังไม่แน่ใจด้วยว่าเครื่องหมายคำพูดและเครื่องหมายจุลภาคทั้งหมดจะเป็นวิธีที่ดีที่สุดในการหลีกอักขระเหล่านี้ หรือเครื่องหมายคำพูดเดี่ยวที่อยู่รอบสตริงทั้งหมดนั้นเพียงพอหรือไม่

การทำความเข้าใจว่า "ขอให้ regexes แยกวิเคราะห์ HTML โดยพลการนั้น เช่น การขอให้ปารีส ฮิลตันเขียนระบบปฏิบัติการ บางครั้งมันก็เหมาะสมที่จะแยกวิเคราะห์ชุด HTML ที่รู้จักและจำกัด" แต่การถูกจำกัดอยู่ในชุดเครื่องมือของฉันไว้ที่ PowerShell ฉันกำลังพยายามทำความเข้าใจวิธีที่ดีที่สุดในการเพิ่มทั้งสอง -replace บรรทัดไปยังตัวแปร $content ที่มีอยู่...คั่นด้วยเครื่องหมายจุลภาคภายในเครื่องหมายปีกกาใช่หรือไม่ เชื่อมต่อกันเหรอ?

ต่อไปนี้เป็นกลยุทธ์ที่ดีที่สุดหรือไม่ หรือมีอะไรดีกว่านี้?

$content = Get-Content $file.Fullname | ? {$_ -notmatch "<\?xml[^>]+>", 
    -replace '("foo.htm", "", ">", "Home", "foo1.htm")', '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx"),
    -replace 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");', '' } 

person dwwilson66    schedule 19.12.2013    source แหล่งที่มา
comment
ทุกครั้งที่คุณแยกวิเคราะห์ HTML ด้วยนิพจน์ทั่วไป catgirl จะตายอยู่ที่ไหนสักแห่ง เครื่องมือที่เหมาะสมพร้อมให้คุณใช้งานแล้ว ใช้มัน.   -  person Ansgar Wiechers    schedule 20.12.2013
comment
บันทึก CATGIRLS! น่าเสียดายที่ชุดเครื่องมือของฉันขยายไปถึง PowerShell v1.0; ฉันอยู่ในพื้นที่ผู้ใช้และถูกล็อคมากกว่าที่ฉันต้องการทำงาน ฉันแน่ใจว่าฝ่ายไอทีสามารถหาวิธีดึง PS ออกจาก Win7 เพื่อป้องกันไม่ให้ฉันใช้มันได้หรือไม่ พวกเขาก็จะทำ ไม่มีเครื่องมือที่เหมาะสมที่คุณพูดถึงใด ๆ ที่ฉันใช้งานได้เพราะฉันไม่มีสิทธิ์ที่เหมาะสม...อย่าให้ฉันเริ่มต้นเลย   -  person dwwilson66    schedule 20.12.2013
comment
Tidy เป็นทางเลือกสำหรับการปรับโค้ดให้สวยงาม ส่วนที่เหลือมีอยู่ใน Windows/PowerShell   -  person Ansgar Wiechers    schedule 20.12.2013


คำตอบ (1)


หากฉันอ่านคำถามถูกต้อง ฉันคิดว่านี่อาจทำสิ่งที่คุณต้องการ:

$Regex0 = '<?xml version="1.0" encoding="utf-8"?> '

$Regex1 =  '("foo.htm", "", ">", "Home", "foo1.htm")'
$Replace1 =  '("http:\\sharepoint.site\home.aspx", "", ">", "Home", "http:\\sharepoint.site\home.aspx")'

$Regex2 = 'addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");'


foreach($file in $temp01)
    {
        $outfile = $destinationPath + $file
        (Get-Content $file.Fullname) -notmatch $Regex0,'' -replace $Regex1,$Replace1 -replace $Regex2,'' |
         Set-Content -path $outfile -Force -Value $content
    }
person mjolinor    schedule 19.12.2013
comment
ตามทฤษฎีแล้ว ใช่ แต่ไม่มี regex :) บรรทัดที่ใช้ regex นั้นสวยงามสำหรับฉันเพราะมันแค่ไม่รวมบรรทัดที่ตรงกับรูปแบบ ฉันกำลังพยายามหาวิธีเพิ่ม -replace บรรทัดอีกสองบรรทัดเข้าไปด้วย...สามารถรวมชุดของ staements ไว้ในเครื่องหมายปีกกาและคั่นด้วยเครื่องหมายจุลภาคได้หรือไม่ ผลลัพธ์ของแต่ละการส่งผ่านไปยัง -replace ถัดไป? - person dwwilson66; 20.12.2013
comment
อัปเดตสคริปต์ คุณสามารถเชื่อมโยงตัวดำเนินการจับคู่/ไม่ตรงกัน และ -แทนที่ และผลลัพธ์ที่กรอง/แทนที่จะถูกส่งต่อไปยังตัวดำเนินการถัดไป ดังนั้นคุณไม่จำเป็นต้องมีไปป์ไลน์ในระหว่างนั้น - person mjolinor; 20.12.2013
comment
อ่า...นั่นก็สมเหตุสมผลดี ขอบคุณ. ฉันยังอัปเดตคำถามของฉันเพื่อให้ข้อมูลเฉพาะชัดเจนยิ่งขึ้น และทำให้มันชัดเจนว่าฉันไม่ได้พยายามฆ่า catgirls ด้วย regex :) - person dwwilson66; 20.12.2013
comment
คุณอาจจะฆ่าพวกเขาอยู่แล้ว พวกมันมีเก้าชีวิต แต่คุณมี foreach loop ดังนั้นมันขึ้นอยู่กับจำนวนไฟล์ที่คุณมี - person mjolinor; 20.12.2013