2016-07-05 8 views
0

я использую некоторые PowerShell скрипт для создания SQL заявления для добавления устройств в коллекции в SCCM 2012.PowerShell скрипт перестает работать, когда я включаю его в функцию

Это код, я использую:

$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 идентична, но когда я использую метод функции окончательное правило запроса не работает ...

Я уверен, что это что-то простое, я просто не могу понять это! Есть предположения?

ответ

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%' 
+0

Awww dang it rookie error! Приветствую вас за помощь! – Brick

4

ответ Мартина лучше на практике, но в качестве альтернативы вы можете присвоить область вашей переменной $script:Query, и ваша функциональная версия будет работать нормально. Откройте скрипт в ISE, замените все экземпляры $Query на $script:Query и запустите его снова. Я уверен, что он работает так же, как оригинальный скрипт.

Проблема, с которой вы сталкиваетесь, - это объем. $Query, который обновляется в вашей функции, находится в дочерней области и исчезает после завершения функции. Для получения дополнительной информации запустите Get-Help about_Scopes в своей комнате.

 Смежные вопросы

  • Нет связанных вопросов^_^