当我将其转换为函数时,PowerShell脚本停止工作

时间:2016-07-05 13:27:17

标签: function powershell sccm

我使用一些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的回显是相同的,但是当我使用函数方法时,最终的查询规则不起作用......

我确定它的简单,我只是无法弄明白!有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您不会将函数调用的输出分配给$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%'

答案 1 :(得分:4)

Martin的答案在实践中更好,但您也可以将变量的范围指定为$script:Query,并且您的功能版本可以正常工作。在ISE中打开您的脚本,将$Query的所有实例替换为$script:Query,然后再次运行。我打赌它就像原始剧本一样。

您遇到的问题是范围问题。函数中正在更新的$Query位于子范围内,并在函数完成后消失。有关详细信息,请在您的PowerShell中运行Get-Help about_Scopes