วิธีใช้ PowerShell แทนที่เพื่อแทนที่สตริงหรืออักขระ
คุณจำเป็นต้องแทนที่สตริงหรืออักขระใน PowerShell หรือไม่ หรือคุณต้องการแทรกบล็อคข้อความที่สมบูรณ์ลงในไฟล์? ฟังก์ชันการแทนที่ใน PowerShell คือสิ่งที่คุณกำลังมองหา
ด้วยวิธีแทนที่หรือตัวดำเนินการ -replace ใน PowerShell เราสามารถค้นหาและแทนที่อักขระหรือสตริง (บางส่วน) ด้วยข้อมูลอื่นได้
ในบทความนี้ เราจะดูวิธีการต่างๆ ในการแทนที่สตริงใน PowerShell และฉันจะให้ตัวอย่างที่เป็นประโยชน์แก่คุณเมื่อพูดถึงฟังก์ชันการแทนที่
Powershell แทนที่อักขระในสตริง
ใน PowerShell เราสามารถใช้เมธอด Replace() กับสตริงหรือตัวแปรใดๆ ที่เป็นสตริง วิธีการนี้จำเป็นต้องมีอาร์กิวเมนต์สองตัว ได้แก่ ข้อความหรืออักขระที่คุณต้องการค้นหาและอาร์กิวเมนต์ที่คุณต้องการแทนที่ด้วย
การอธิบายฟังก์ชันการแทนที่ PowerShell ทำได้ดีที่สุดโดยใช้ตัวอย่าง ดังนั้นเรามาเริ่มด้วยตัวอย่างง่ายๆ กันก่อน เช่น การแทนที่อักขระหรือคำในสตริง
ลองใช้สตริงต่อไปนี้:
$str = "Welcome to LazyAdmin"หากต้องการแทนที่คำว่า to เป็น at เราสามารถใช้วิธีต่อไปนี้:
$str = $str.Replace('to','at')ฉันได้เก็บผลลัพธ์ของวิธีการแทนที่ไว้ในตัวแปรเดียวกัน คุณไม่จำเป็นต้องใช้ตัวแปรเพื่อใช้วิธีการแทนที่ใน PowerShell คุณสามารถแทนที่สตริงได้โดยตรงหากต้องการ
"Welcome to LazyAdmin".Replace('to','at')อีกตัวอย่างหนึ่งที่ฉันมักใช้คือการแทนที่เครื่องหมายสแลชในเส้นทางโฟลเดอร์:
$Paths = "folder\subfolder"
$Paths.replace('\','\\')
# Result
folder\\subfolderการลบอักขระหรือคำออกจากสตริง
นอกจากนี้เรายังสามารถใช้วิธีแทนที่เพื่อลบคำหรืออักขระออกจากสตริงได้ ในการดำเนินการนี้ เราเพียงแต่ต้องแทนที่เนื้อหาด้วยสตริงว่าง เช่นนี้
# Replace the word 'to' with nothing
$str.Replace("to","")ลองใช้รายชื่อที่อยู่อีเมลและลบชื่อโดเมนและสัญลักษณ์ @ ออกจากนั้น ดังนั้นเราจึงเหลือเพียงชื่อผู้ใช้เท่านั้น เราจะวนซ้ำอาร์เรย์ด้วยที่อยู่อีเมลและเก็บผลลัพธ์ไว้ใน $usernames:
$mailAddresses = @("AdeleV@lazydev.com","GradyA@lazydev.com","JoniS@lazydev.com")
$usernames = @()
$mailAddresses | ForEach{
$usernames += $_.Replace("@lazydev.com","")
}
# Result
AdeleV
GradyA
JoniSแทรกข้อความลงในเทมเพลตด้วยการแทนที่
สคริปต์บางตัวที่ฉันสร้างขึ้นได้ส่งอีเมลพร้อมข้อมูล เช่น ชื่อผู้ใช้และรหัสผ่านของผู้ใช้ใหม่ หรือภาพรวมของผู้ใช้ทั้งหมดที่ไม่ได้เปิดใช้งาน MFA
สำหรับอีเมลเหล่านั้น ฉันได้สร้างเทมเพลตอีเมล HTML และภายในเทมเพลตนี้ ฉันวางตัวยึดตำแหน่งสำหรับชื่อผู้ใช้และรหัสผ่าน
<p>Hi {{manager.firstname}},</p>
<p>The account for {{user.fullname}} is ready. Below you will find the login credentials for {{user.firstname}}. The password is temporary and needs to be changed after the first login.</p>
<p>
<table class="details">
<tr>
<td style="font-family:sans-serif;font-size:14px;">Username: </td>
<td style="color:#000000;"><strong>{{user.UserPrincipalName}}</strong></td>
</tr>
<tr>
<td style="font-family:sans-serif;font-size:14px;">Password: </td>
<td><strong>{{user.Password}}</strong></td>
</tr>
</table>
</p>
<p>If you have any questions, please let us know</p>
<p>IT</p>ดังที่คุณเห็นในเทมเพลต HTML ฉันได้สร้างตัวยึดตำแหน่งด้วยวงเล็บปีกกา {{ }} ด้วย PowerShell เราสามารถโหลดเนื้อหาของไฟล์ HTML และใช้การแทนที่เพื่อแทนที่ตัวยึดตำแหน่งทั้งหมดด้วยค่าที่ถูกต้อง:
#Get the mailtemplate
$mailTemplate = (Get-Content ($rootPath + '\' + $config.Settings.mailTemplateManager)) | ForEach-Object {
$_ -replace '{{manager.firstname}}', $manager.GivenName `
-replace '{{user.UserPrincipalName}}', $user.UserPrincipalname `
-replace '{{user.Password}}', $config.Settings.password `
-replace '{{user.fullname}}', $user.fullName `
-replace '{{user.firstname}}', $user.givenName
} | Out-String
return $mailTemplate
ในกรณีนี้ ฉันใช้ตัวดำเนินการ -replace แต่คุณสามารถใช้วิธี replace() เพื่อแทนที่หลายอินสแตนซ์ได้:
$str = "Welcome to LazyAdmin"
$str.Replace('Welcome','Hello').Replace('to ','')
# Result
Hello LazyAdminPowershell แทนที่ Regex
นอกจากวิธี Replace() แล้ว เรายังมีตัวดำเนินการ -replace อีกด้วย โดยพื้นฐานแล้วพวกเขาสามารถทำเช่นเดียวกัน โดยแทนที่อักขระหรือคำในสตริงด้วยอย่างอื่น แต่มีความแตกต่างอย่างมากระหว่างทั้งสอง ตัวดำเนินการ -replace ใช้ regex เพื่อจับคู่ส่วนที่ค้นหา
บันทึก
ตัวดำเนินการ -replace ใช้ regex ในการค้นหาคีย์เวิร์ดเท่านั้น ไม่ใช้ regex กับส่วนที่แทนที่ของตัวดำเนินการ
มาดูตัวอย่างต่อไปนี้ ฉันมีรายการไฟล์บันทึกที่ฉันต้องการเปลี่ยนชื่อจาก .log เป็น .txt เป็นต้น
ในการดำเนินการนี้ เราสามารถใช้ตัวดำเนินการ -replace ใน PowerShell เพื่อเลือก .log จากท้ายสตริงและแทนที่ด้วย .txt
Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\.log$','.txt' }ในกรณีนี้ เรายังสามารถใช้เมธอด replace() ได้ เนื่องจาก .log มีเอกลักษณ์เฉพาะตัวเพียงพอที่จะเลือกและแทนที่ได้ แต่หากเราต้องการลบปีออกจากชื่อไฟล์ เราก็จำเป็นต้องใช้นิพจน์ทั่วไปสำหรับสิ่งนี้:
# Find 4 digits with \d{4}
Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\d{4}','' }การสร้างนิพจน์ทั่วไปอาจเป็นเรื่องที่ท้าทายเล็กน้อยหากคุณไม่ได้ทำทุกวัน เว็บไซต์ที่ดีในการทดสอบนิพจน์ของคุณคือ regex101.com
การเปลี่ยนแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ตัวดำเนินการ -Replace จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตามค่าเริ่มต้น คุณสามารถกำหนดให้พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ได้โดยใช้ตัวดำเนินการ -creplace แทน -replace ตัวอย่างเช่น:
$str = "Hello LazyAdmin"
# Case insensitive
$str -replace 'hello', 'Goodbye';
# Result : Goodbye LazyAdmin
# Case sensitive
$str -creplace 'hello', 'Goodbye;
# Result : Hello LazyAdminPowershell แทนที่อักขระพิเศษ
ด้วยตัวดำเนินการแทนที่ใน PowerShell เราสามารถแทนที่อักขระพิเศษทั้งหมดในสตริงได้อย่างง่ายดาย Regex อนุญาตให้เราเลือกอักขระที่ไม่ใช่คำทั้งหมด ยกเว้น a-z, A-Z และ 0-9 เป็นอย่างอื่น
ตัวอย่างเช่น:
$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('\W', '')
# Result
LongStringwith_specialcharacter123andspacesหากคุณต้องการลบอักขระพิเศษทั้งหมด ยกเว้นช่องว่าง เราจำเป็นต้องใช้นิพจน์ regex ที่แตกต่างกันเล็กน้อย:
$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('[^a-zA-Z\d\s:]', '')
# Result
Long String with specialcharacter123 and spacesห่อขึ้น
การแทนที่อักขระหรือคำในสตริงด้วย PowerShell ทำได้ง่ายๆ โดยใช้วิธีแทนที่หรือตัวดำเนินการ -replace เมื่อทำงานกับอักขระพิเศษ เช่น สัญลักษณ์ [ ],\หรือ $ มักจะใช้วิธี replace() ได้ง่ายกว่าตัวแปรของตัวดำเนินการ เพราะด้วยวิธีนี้คุณไม่จำเป็นต้องหลบหนีจากตัวละครพิเศษ
และโปรดจำไว้ว่าให้ทดสอบสคริปต์ของคุณก่อนที่จะรันกับข้อมูลหรือไฟล์จริงเสมอ
หากคุณมีคำถามใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง


