ค้นหาเว็บไซต์

วิธีใช้ 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 LazyAdmin

Powershell แทนที่ 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 LazyAdmin

Powershell แทนที่อักขระพิเศษ

ด้วยตัวดำเนินการแทนที่ใน 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() ได้ง่ายกว่าตัวแปรของตัวดำเนินการ เพราะด้วยวิธีนี้คุณไม่จำเป็นต้องหลบหนีจากตัวละครพิเศษ

และโปรดจำไว้ว่าให้ทดสอบสคริปต์ของคุณก่อนที่จะรันกับข้อมูลหรือไฟล์จริงเสมอ

หากคุณมีคำถามใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง

บทความที่เกี่ยวข้อง