Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function PowerShell脚本在我将其转换为函数时停止工作_Function_Powershell_Sccm - Fatal编程技术网

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

Function PowerShell脚本在我将其转换为函数时停止工作,function,powershell,sccm,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

我使用一些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中运行
获取有关作用域的帮助。

Awww dang it新手错误!为你的帮助干杯!