จะแชร์ตัวแปรระหว่างฟังก์ชันใน PowerShell ได้อย่างไร
ผู้ดูแลระบบ PowerShell คนหนึ่งถามฉันเกี่ยวกับการแชร์ตัวแปรระหว่างฟังก์ชันต่างๆ ใน PowerShell มีวิธีการที่แตกต่างกันในการทำเช่นนี้ ในบทช่วยสอนนี้ ฉันจะแสดงวิธีแชร์ตัวแปรระหว่างฟังก์ชันต่างๆ ใน PowerShell พร้อมตัวอย่าง
หากต้องการแชร์ตัวแปรระหว่างฟังก์ชันต่างๆ ใน PowerShell โดยใช้วิธีตัวแปรส่วนกลาง คุณสามารถประกาศตัวแปรด้วยคำนำหน้า $global: ทำให้สามารถเข้าถึงได้จากทุกที่ภายในสคริปต์ของคุณ รวมถึงฟังก์ชันภายในด้วย ตัวอย่างเช่น $global:userCount=0 เริ่มต้นตัวแปรส่วนกลางที่สามารถแก้ไขได้โดยฟังก์ชันใดๆ เช่น AddUser และ RemoveUser เพื่อให้มั่นใจว่า ค่าของตัวแปรได้รับการอัปเดตอย่างสม่ำเสมอและเข้าถึงได้จากฟังก์ชันต่างๆ
แบ่งปันตัวแปรระหว่างฟังก์ชันใน PowerShell
ตอนนี้ ให้ฉันแสดงวิธีการต่างๆ เพื่อแชร์ตัวแปรระหว่างฟังก์ชันต่างๆ ใน PowerShell
1. การใช้ตัวแปรร่วม
วิธีหนึ่งในการแบ่งปันตัวแปรระหว่างฟังก์ชันใน PowerShell คือการใช้ตัวแปรส่วนกลาง หากต้องการประกาศตัวแปรส่วนกลาง คุณสามารถใช้คำนำหน้า $global: ตามด้วยชื่อตัวแปรได้ ตัวแปรส่วนกลางสามารถเข้าถึงได้จากทุกที่ภายในสคริปต์ PowerShell ของคุณ รวมถึงฟังก์ชันภายในด้วย
นี่คือตัวอย่างที่สาธิตการใช้ตัวแปรร่วม:
$global:userCount = 0
function AddUser {
$global:userCount++
Write-Host "User added. Total users: $global:userCount"
}
function RemoveUser {
$global:userCount--
Write-Host "User removed. Total users: $global:userCount"
}
AddUser
AddUser
RemoveUser
ในตัวอย่างนี้ เราประกาศตัวแปรโกลบอล $global:userCount เพื่อติดตามจำนวนผู้ใช้ ฟังก์ชัน AddUser และ RemoveUser จะปรับเปลี่ยนตัวแปรร่วม และการเปลี่ยนแปลงจะมีผลทั่วทั้งสคริปต์
ฉันรันสคริปต์ PowerShell ข้างต้น และคุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:
2. การส่งผ่านตัวแปรเป็นพารามิเตอร์
ตอนนี้ให้ฉันแสดงวิธีอื่นในการแชร์ตัวแปรระหว่างฟังก์ชันให้คุณดู
อีกวิธีหนึ่งในการแบ่งปันตัวแปรระหว่างฟังก์ชันคือการส่งผ่านตัวแปรเหล่านั้นเป็นพารามิเตอร์ ซึ่งจะทำให้คุณสามารถระบุตัวแปรที่จะแชร์ได้อย่างชัดเจน และช่วยให้สามารถควบคุมขอบเขตของตัวแปรได้ดีขึ้น
ฉันขอแสดงตัวอย่างง่ายๆให้คุณดู
function Get-UserName {
param (
[string]$userName
)
Write-Output "User Name: $userName"
}
function Set-UserName {
param (
[string]$newName
)
return $newName
}
# Call functions
$userName = "User01"
Get-UserName -userName $userName
$userName = Set-UserName -newName "User02"
Get-UserName -userName $userNameในตัวอย่างนี้ ฟังก์ชัน Set-UserName ส่งคืนค่าใหม่ ซึ่งจะถูกส่งต่อไปยังฟังก์ชัน Get-UserName
นี่คือผลลัพธ์ในภาพหน้าจอด้านล่างหลังจากที่ฉันรันสคริปต์ PowerShell ด้านบน
ผมขอแสดงให้คุณเห็นอีกตัวอย่างหนึ่ง
function CalculateTax($amount, $taxRate) {
$tax = $amount * $taxRate
return $tax
}
function ProcessInvoice($invoiceAmount) {
$salesTaxRate = 0.08
$stateTaxRate = 0.05
$salesTax = CalculateTax -amount $invoiceAmount -taxRate $salesTaxRate
$stateTax = CalculateTax -amount $invoiceAmount -taxRate $stateTaxRate
$totalTax = $salesTax + $stateTax
$totalAmount = $invoiceAmount + $totalTax
Write-Host "Invoice Amount: $invoiceAmount"
Write-Host "Sales Tax: $salesTax"
Write-Host "State Tax: $stateTax"
Write-Host "Total Amount: $totalAmount"
}
ProcessInvoice -invoiceAmount 1000
ในตัวอย่างนี้ ฟังก์ชัน CalculateTax ยอมรับพารามิเตอร์ $amount และ $taxRate และส่งกลับภาษีที่คำนวณได้ ฟังก์ชัน ProcessInvoice เรียก CalculateTax สองครั้ง โดยส่งจำนวนเงินในใบแจ้งหนี้และอัตราภาษีตามลำดับเป็นอาร์กิวเมนต์ จากนั้นค่าที่ส่งคืนจะใช้ในการคำนวณภาษีรวมและจำนวนเงินทั้งหมด
คุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:
ตรวจสอบวิธีการตรวจสอบว่าตัวแปรเป็น Null ใน PowerShell หรือไม่
3. การใช้ขอบเขตสคริปต์
PowerShell มีขอบเขตสคริปต์ที่ช่วยให้คุณสามารถแชร์ตัวแปรระหว่างฟังก์ชันต่างๆ ภายในสคริปต์เดียวกันได้ ด้วยการตั้งค่าตัวแปรโดยใช้ขอบเขตสคริปต์ในโมดูล ตัวแปรต่างๆ จะสามารถแชร์ระหว่างฟังก์ชันของโมดูลได้
ตัวแปรในขอบเขตสคริปต์พร้อมใช้งานสำหรับฟังก์ชันทั้งหมดภายในสคริปต์ วิธีการนี้มีประโยชน์สำหรับการแชร์ตัวแปรโดยไม่ทำให้สามารถเข้าถึงได้จากทั่วโลก
ฉันขอแสดงตัวอย่างให้คุณดู
# Declare a script scope variable
$script:databaseName = "Database01"
function Get-DatabaseName {
Write-Output "Database Name: $script:databaseName"
}
function Set-DatabaseName {
param (
[string]$newName
)
$script:databaseName = $newName
}
# Call functions
Get-DatabaseName
Set-DatabaseName -newName "Database02"
Get-DatabaseNameในที่นี้ $script:databaseName จะถูกแชร์ระหว่างฟังก์ชัน Get-DatabaseName และ Set-DatabaseName ซึ่งสามารถเข้าถึงได้ภายในสคริปต์เท่านั้น
นี่เป็นอีกตัวอย่างหนึ่งที่อธิบายการใช้ขอบเขตสคริปต์:
$script:dbConnection = $null
function ConnectToDatabase {
$script:dbConnection = New-Object System.Data.SqlClient.SqlConnection("ConnectionString")
$script:dbConnection.Open()
Write-Host "Connected to the database"
}
function ExecuteQuery($query) {
$command = $script:dbConnection.CreateCommand()
$command.CommandText = $query
$result = $command.ExecuteReader()
return $result
}
function DisconnectFromDatabase {
$script:dbConnection.Close()
Write-Host "Disconnected from the database"
}
ConnectToDatabase
$data = ExecuteQuery -query "SELECT * FROM Users"
# Process the data...
DisconnectFromDatabaseในตัวอย่างนี้ เราประกาศตัวแปรขอบเขตสคริปต์ $script:dbConnection เพื่อจัดเก็บการเชื่อมต่อฐานข้อมูล ฟังก์ชัน ConnectToDatabase เตรียมใช้งานการเชื่อมต่อ และฟังก์ชัน ExecuteQuery ใช้การเชื่อมต่อที่ใช้ร่วมกันเพื่อดำเนินการแบบสอบถาม สุดท้าย ฟังก์ชัน DisconnectFromDatabase จะปิดการเชื่อมต่อ
อ่านตัวแปรการพิมพ์ PowerShell
4. การใช้ตัวแปรประเภทการอ้างอิง
ใน PowerShell ตัวแปรประเภทการอ้างอิงอนุญาตให้ฟังก์ชันเปลี่ยนค่าของตัวแปรนอกขอบเขตได้ วิธีการนี้มีประโยชน์เมื่อคุณต้องการฟังก์ชันเพื่อแก้ไขตัวแปรโดยตรง
นี่คือตัวอย่าง
function Increment-Count {
param (
[ref]$count
)
$count.Value++
}
# Declare a variable
$count = 0
# Call function
Increment-Count -count ([ref]$count)
Write-Output "Count: $count"
Increment-Count -count ([ref]$count)
Write-Output "Count: $count"ในตัวอย่างนี้ ฟังก์ชัน Increase-Count ใช้ตัวแปรอ้างอิงเพื่อแก้ไขตัวแปร $count โดยตรง
บทสรุป
ในบทช่วยสอนนี้ ฉันได้อธิบายวิธีแชร์ตัวแปรระหว่างฟังก์ชันใน PowerShell โดยใช้วิธีการที่แตกต่างกัน เช่น ตัวแปรร่วม การส่งตัวแปรเป็นพารามิเตอร์ การใช้ประโยชน์จากขอบเขตสคริปต์ ฯลฯ


