当我把它变成一个函数时,PowerShell 脚本停止工作
PowerShell script stops working when I turn it into a function
我使用一些 PowerShell 脚本创建了一个 SQL 语句,用于将设备添加到 SCCM 2012 中的集合。
这是我使用的代码:
$Sites = @("ULH","LVH","MPH","MAH")
$Query = ""
$First = $True
Foreach ($Site in $Sites) {
if ($First -eq $True) {
$Query += "SMS_R_System.Name like '%$Site%'"
$First = $false
}
else {
$Query += " or SMS_R_System.Name like '%$Site%'"
}
}
echo $Query
Add-CMDeviceCollectionQueryMembershipRule -CollectionName "test" -QueryExpression "select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where ($Query) and SMS_R_System.Name like '%IMS%' and SMS_R_System.Name not like '%MAM%'" -RuleName "IMS Servers"
这按预期工作,但我希望将它变成一个函数,所以我这样做了:
$Sites = @("ULH","LVH","MPH","MAH")
$Query = ""
function Querybuilder($Sites) {
$First = $True
Foreach ($Site in $Sites) {
if ($First -eq $True) {
$Query += "SMS_R_System.Name like '%$Site%'"
$First = $false
}
else {
$Query += " or SMS_R_System.Name like '%$Site%'"
}
}
return $Query
}
Querybuilder $Sites
echo $Query
Add-CMDeviceCollectionQueryMembershipRule -CollectionName "test" -QueryExpression "select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where ($Query) and SMS_R_System.Name like '%IMS%' and SMS_R_System.Name not like '%MAM%'" -RuleName "IMS Servers"
在代码的两个实例中,$Query
的回显是相同的,但是当我使用函数方法时,最终的查询规则不起作用...
我敢肯定这很简单,我就是想不通!有什么想法吗?
您没有将函数调用的输出分配给 $Query
。所以就这样做:
$Query = Querybuilder $Sites
另外,你可以简化你的函数:
$Sites = @("ULH","LVH","MPH","MAH")
function Get-Query
{
Param(
[string[]]$Sites
)
($Sites | ForEach-Object {
"SMS_R_System.Name like '%{0}%'" -f $_
}) -join ' or '
}
$Query = Get-Query $Sites
$Query
的输出:
SMS_R_System.Name like '%ULH%' or SMS_R_System.Name like '%LVH%' or SMS_R_System.Name like '%MPH%' or SMS_R_System.Name like '%MAH%'
Martin 的答案在实践中更好,但您也可以将变量的范围分配给 $script:Query
,您的功能版本将正常工作。在 ISE 中打开您的脚本,将 $Query
的所有实例替换为 $script:Query
,然后再次 运行。我敢打赌它会像原始脚本一样工作。
您运行遇到的问题是范围问题。在您的函数中更新的 $Query
位于子范围内,并且在函数完成后消失。如需更多信息,请在您的 powershell 中 运行 Get-Help about_Scopes
。
我使用一些 PowerShell 脚本创建了一个 SQL 语句,用于将设备添加到 SCCM 2012 中的集合。
这是我使用的代码:
$Sites = @("ULH","LVH","MPH","MAH")
$Query = ""
$First = $True
Foreach ($Site in $Sites) {
if ($First -eq $True) {
$Query += "SMS_R_System.Name like '%$Site%'"
$First = $false
}
else {
$Query += " or SMS_R_System.Name like '%$Site%'"
}
}
echo $Query
Add-CMDeviceCollectionQueryMembershipRule -CollectionName "test" -QueryExpression "select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where ($Query) and SMS_R_System.Name like '%IMS%' and SMS_R_System.Name not like '%MAM%'" -RuleName "IMS Servers"
这按预期工作,但我希望将它变成一个函数,所以我这样做了:
$Sites = @("ULH","LVH","MPH","MAH")
$Query = ""
function Querybuilder($Sites) {
$First = $True
Foreach ($Site in $Sites) {
if ($First -eq $True) {
$Query += "SMS_R_System.Name like '%$Site%'"
$First = $false
}
else {
$Query += " or SMS_R_System.Name like '%$Site%'"
}
}
return $Query
}
Querybuilder $Sites
echo $Query
Add-CMDeviceCollectionQueryMembershipRule -CollectionName "test" -QueryExpression "select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where ($Query) and SMS_R_System.Name like '%IMS%' and SMS_R_System.Name not like '%MAM%'" -RuleName "IMS Servers"
在代码的两个实例中,$Query
的回显是相同的,但是当我使用函数方法时,最终的查询规则不起作用...
我敢肯定这很简单,我就是想不通!有什么想法吗?
您没有将函数调用的输出分配给 $Query
。所以就这样做:
$Query = Querybuilder $Sites
另外,你可以简化你的函数:
$Sites = @("ULH","LVH","MPH","MAH")
function Get-Query
{
Param(
[string[]]$Sites
)
($Sites | ForEach-Object {
"SMS_R_System.Name like '%{0}%'" -f $_
}) -join ' or '
}
$Query = Get-Query $Sites
$Query
的输出:
SMS_R_System.Name like '%ULH%' or SMS_R_System.Name like '%LVH%' or SMS_R_System.Name like '%MPH%' or SMS_R_System.Name like '%MAH%'
Martin 的答案在实践中更好,但您也可以将变量的范围分配给 $script:Query
,您的功能版本将正常工作。在 ISE 中打开您的脚本,将 $Query
的所有实例替换为 $script:Query
,然后再次 运行。我敢打赌它会像原始脚本一样工作。
您运行遇到的问题是范围问题。在您的函数中更新的 $Query
位于子范围内,并且在函数完成后消失。如需更多信息,请在您的 powershell 中 运行 Get-Help about_Scopes
。