如何在PowerShell命令中查找数据和替换变量

时间:2018-11-12 18:00:12

标签: powershell

我目前有一系列的Dyanmic通讯组,要在其中编辑收件人筛选器。我们公司的地址是4位数字。该号码是动态通讯组的显示名称的一部分...示例webcontact_1234_DG .... 1234将是4位数字的中心号码。我想替换收件人过滤器以使其具有office -eq(1234),但要从显示名称中提取该数字。所有显示名称的位数都必须与4位中心数字之前的字符相同,例如,webcontact_1234_DG,webcontact_2345_DG,webcontact_3456_DG等。

我有一个替换代码,但是它将办公室位置更改为空。

这是我正在使用的代码:

$groups=Get-DynamicDistributionGroup -filter {alias -like "webcontact*"}
foreach ($group in $groups) {
     $locationcode=$($group.alias).tostring.replace("\\D", "")
     set-dynamicdistributiongroup $group -recipientfilter {((((office -eq $locationcode) -and
      (have the recipent filter here but can't display due to confidential information) -and
      (RecipientType -eq 'UserMailbox') -and
      (-not(RecipientTypeDetails -eq 'RoomMailbox')) -and
      (-not(RecipientTypeDetails -eq 'SharedMailbox'))))}
}

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用-split运算符从值中提取数字(文本) [1]

$locationcode = ($group.Alias -split '_')[1]

-split '_'返回将输入字符串除以_个字符而得到的标记数组,而[1]返回第二个标记,这是所需的位置号。

>

简单的例子:

PS> ('webcontact_3456_DG' -split '_')[1]
3456

或者,您自己尝试的更正版本(请参见下文)将使用 -replace运算符

PS> 'webcontact_3456_DG' -replace '\D' # remove all non-digit chars.
3456

关于您尝试过的事情

$($group.alias).tostring.replace("\\D", "")
  • [string]类型的.Replace()通过 literal 字符串搜索,因此在您的姓名中搜索\\D将会失败,并且不会进行替换

    • 此外,请注意,PowerShell的转义字符是`(反引号),而不是\,因此\不需要转义:在PowerShell "\\D"中实际上变成了\\D
  • 顺便说一句:通常不需要在表达式两边加上$(...)


[1]在这种简单情况下,您也可以使用[string]类型的.Split() .NET 方法,但是使用I suggest using the far more flexible -split PS operator as a matter of habit

答案 1 :(得分:0)

根据给定的信息,这是我可以提供的最佳答案。我假设您在从webcontact_1234_DG中获取该数字时遇到问题,我将使用正则表达式将这些数字输入另一个变量。

$locationcode = [regex]::Match($group.alias,'^[^_]+_([^_]+)_[^_]+$').Groups[1].Value

上面的代码将抓住两个下划线之间的所有内容。

尝试一下,让我知道。