【问题标题】:If statement inside a ForEach using csv使用 csv 的 ForEach 中的 If 语句
【发布时间】:2012-11-16 21:14:19
【问题描述】:

我们正在使用 powershell 在我们的 Active Directory 中自动创建我们的学生用户。除了启用邮箱,我们一切正常。我们只向中学生提供电子邮件地址。所以我试图让脚本读取 csv 并且只为中学生启用邮箱。我们所有中学的校园号都小于 100,所以我尝试让脚本使用 ForEach,然后如果 $_.extensionAttribute1(csv 中带有校园号的列)小于 100,那么它将邮件启用该帐户.我遇到的问题是只处理第一个用户并结束脚本。我希望它遍历 csv 中的每一行。这是我的脚本。

add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010

Import-CSV C:\scripts\updateuser.csv | ForEach {
    $campus =$_.extensionAttribute1
    If ($campus -lt '100') {
    Enable-Mailbox -Identity $_.sAMAccountName -Database NISDSRV6DB1
    }}

您可以提供任何帮助以使其在整个 csv 中运行,我们将不胜感激。 提前感谢您的帮助。

编辑...我在搞乱 csv 文件,得到了一些有趣的结果。该脚本显示任何内容的唯一方法是 extensionAttribute1 字段填充了 1。我试图获取所有小于 100 的用户。

【问题讨论】:

  • 您的语法看起来正确 - 您确定它的行为方式与您想象的一样吗?尝试在 if 语句之前写一条消息进行调试,以查看它在 ForEach-Object 循环中执行了多少次。
  • 您的代码看起来不错,我会考虑复制您的 CSV 文件,或者至少将一个虚拟 CSV 文件放在一起并针对它进行测试。我怀疑您当前 CSV 中的某些内容在处理第一行后导致循环停止。

标签: powershell csv if-statement foreach


【解决方案1】:

您的“extensionAttribute1”值未在“if”语句中正确转换为整数。试试这个:

add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010

Import-CSV C:\scripts\updateuser.csv | ForEach {
    $campus =$_.extensionAttribute1 -as [Int]
    if ($campus -lt '100'){
        Write-Host $_.sAMAccountName            
        Enable-Mailbox -Identity $_.sAMAccountName -Database NISDSRV6DB1
    }
}

【讨论】:

  • 我明白了。我不能提供输入数据,因为它是机密的学生信息。我将使用您的 Write-Host 建议进行测试,看看我得到了什么结果。不幸的是,今天我在创建文件中只有一名中学生,所以我无法测试实际的 csv。感谢您的帮助。
  • 就是这样。它没有将属性读取为 CSV 中的 int。我已经更新了我的脚本,它正在像我最初预期的那样拉动。非常感谢您的帮助!
【解决方案2】:

尝试在变量赋值的末尾添加;

$campus =$_.extensionAttribute1;

【讨论】:

  • 感谢您的建议,但分号导致脚本失败。不过我很感激。
【解决方案3】:

我想通了。我的中学数字是 1、7、10、42、43、44、45 和 46。如果数字是 1,我只会认出小于(奇怪)。如果我在每个数字前面加上 0 到 3 位数字,它就会识别它们。 001、007、010、042、043、044、045 和 046 可以工作并被识别为小于 100。还没有找到原因,但我现在需要调整我的 csv 导出过程以考虑这个数字方案.

【讨论】:

  • 感谢您的更新,我已经修改了我的答案...您不需要调整您的导出过程。
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2017-03-10
  • 2017-12-02
相关资源
最近更新 更多