Powershell 将变量传递给函数

Powershell Passing Variable to Function

我不明白这是怎么回事...

VerifyEmailSettings 函数中,$AdminEmailAddress 是我可以传递给我正在使用的 ps 命令的众多参数之一。

我希望能够将参数名称和值传递给其他函数,如下所示。然而,当我传递这个时,我得到了一些奇怪的结果。正如您在结果中看到的那样,尝试在 VerifyEmailSettings 函数中打印 $SettingName 回显 AdminEmailAddress admin@superuser.com Verified, Same 而不是我想要的... AdminEmailAddress Verified, Same “admin@superuser.com 以某种方式混合在那里。SetEmailSettings 函数中的 $SetName 也是如此。

提前致谢!!

Write-Host "Starting Script"
#Assigning Variables

$AdminEmailAddress = "admin@superuser.com"
$SmtpServer = "exchange.local"
$FromEmailAddress = "fsrm@omg.com"


If (GetInstallStatus){

Write-Host "FSRM Installed, Skipping Install"
Write-Host "Checking Email Settings"
VerifyEmailSettings([string]"AdminEmailAddress",[string]$AdminEmailAddress)

} else {

Write-Host "FSRM Not Installed, Installing"
Install-WindowsFeature –Name FS-Resource-Manager –IncludeManagementTools

    If (GetInstallStatus){
        Write-Host "FSRM Installed"

    } else {
        Write-Host "FSRM Error on Install, Halting"
        #halt here
    }

} 

function GetInstallStatus {
$status = (Get-WindowsFeature -Name FS-Resource-Manager | ft Installed -autosize -hidetableheaders | out-string).trim();
return $status
}

function VerifyEmailSettings([string]$SettingName, [string]$SettingData) {
$Verify = (Get-FsrmSetting | Select-Object $SettingName | FT -autosize -hidetableheaders | Out-String).Trim()

If ($Verify -eq $SettingData) {
    Write-Host $SettingName "Verified, Same"
    SetEmailSettings([string]$SettingName, [string]$SettingData)
} Else {
    Write-Host $SettingName "Wrong, Updating"
    SetEmailSettings([string]$SettingName, [string]$SettingData)
}

}

function SetEmailSettings([string]$SetName, [string]$SetData) {
$SetName
#Set-FsrmSetting $SetName $SetData
}

这是我得到的结果:

Starting Script
FSRM Installed, Skipping Install
Checking Email Settings
AdminEmailAddress admin@superuser.com Verified, Same
AdminEmailAddress admin@superuser.com

不要调用带括号和逗号的 PowerShell 函数

VerifyEmailSettings([string]"AdminEmailAddress",[string]$AdminEmailAddress)

您实际上在这里做的是传递一个包含两个值的数组作为第一个参数,而第二个参数不包含任何值。那应该这样写:

VerifyEmailSettings "AdminEmailAddress" $AdminEmailAddress

VerifyEmailSettings -SettingName "AdminEmailAddress" -SettingData $AdminEmailAddress

(无需将字符串转换为 [string]

使用严格模式

您所做的是 PowerShell 中的一个常见错误,由于您 确实 在 .Net 对象上调用方法时使用括号和逗号,这一错误变得更加常见。在使用 PowerShell 多年后,我仍然偶尔这样做。

您可以 set strict mode 它实际上会为您捕获并警告您:

Set-StrictMode -Version 2.0