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
我不明白这是怎么回事...
在 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