【问题标题】:powershell if statement not executingpowershell if 语句未执行
【发布时间】:2013-08-17 01:19:22
【问题描述】:

我正在尝试编写一个 Powershell 脚本来自动创建 AD 用户。我们是一个混合的 Linux/Windows 环境,并使用文本(现在是 CSV)文件来跟踪旧的 linux UID # 和用户名,这样它们就不会意外地被重复使用。我正在尝试让我的脚本解析文件,但我似乎无法进行比较。

$sam = $GivenName.substring(0,1).ToLower() + $lastname.ToLower()
$usernames=Import-csv "uid.csv" 
ForEach($users in $usernames){
if($usernames.username -contains $sam){$uid = $true}
}

我使用了几种从网络上找到的不同方法将数据从文件读入数组,但问题似乎是无论如何,它永远不会设置 $uid = $true 并且我不知道为什么。

编辑: 我将 if 语句更改为:

if($users.username -contains $sam){$uid = $true}

它奏效了。感谢您的帮助!

为了消除一些混乱,$GivenName 和 $lastname 是由用户输入的,我只是在寻找完全匹配的内容,因为我试图避免重复使用用户名。此外,将 -contains 更改为 -eq 也可以。我已经为此奋斗了太久,如果你看不出我是一个 Powershell 菜鸟。

【问题讨论】:

  • $GivenName$lastname 来自哪里?也就是说,您对$sam 的值是否正确有信心吗?这是否是一个更大的脚本(一个内部循环)的一部分,它正在循环您从另一个来源派生的用户集合?
  • 存储在用户名列中的值是与$sam 完全匹配还是部分匹配?
  • 请发布 uid.csv 的前几行,包括标题行。另外,您如何分配 $givenname$lastname?请显示任何相关代码,并提供数据源示例,以便我们了解它们的外观。
  • 如果你在做foreach($users in $usernames),你应该在代码块中使用$users,而不是$usernames
  • 将 $usernames.username 更改为 $users.username 修复了它。主要问题中有更多的 cmets。谢谢!!!

标签: powershell if-statement


【解决方案1】:

您提供的信息有点不清楚,但我认为这是问题所在:由于 $usernames 来自 CSV 文件,因此 $usernames.username 是一个字符串。 -contains 运算符用于集合(例如数组),并且仅在完全匹配时才有效(如果您正在寻找完全匹配,则应使用 -eq,但我假设这不是你想要的)。请改用 -match。此外,您将 $users 设置为 CSV 中的每条记录,因此它应该是 $users.username。将 if 语句更改为:

if ($users.username -match $sam) {
  $uid = $true
}

【讨论】:

  • 将 $usernames.username 更改为 $users.username 修复了它。主要问题中有更多 cmets。谢谢!!!
【解决方案2】:

您在$users 中的循环中使用的循环变量,但在循环中您使用$usernames。您可能想在 if 语句中使用 $users.username

【讨论】:

  • 我什至没有注意到这一点,但是是的,这也是问题的一部分。但是,-contains 除非完全匹配,否则不会起作用,我认为这不是他所期望的,否则他会使用 -eq
  • 将 $usernames.username 更改为 $users.username 修复了它。主要问题中有更多 cmets。谢谢!!!
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多