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

จะแชร์ตัวแปรระหว่างฟังก์ชันใน 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 โดยใช้วิธีการที่แตกต่างกัน เช่น ตัวแปรร่วม การส่งตัวแปรเป็นพารามิเตอร์ การใช้ประโยชน์จากขอบเขตสคริปต์ ฯลฯ

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