Powershell如果语句和语法

时间:2014-09-16 19:41:37

标签: powershell

我获得了一项对Powershell来说非常完美的任务,并借此机会学习了Powershell脚本语言。

我有一个包含两个列的CSV文件:

Name, Active

我想获取列中已禁用的每条记录的名称。使用该名称,我想检查AD并检查它们是否被禁用。最终,如果他们没有被禁用,我想禁用它们,但我不希望你们为我破坏所有的乐趣!

我在这里,我不知道以下是否可行,但现在有语法错误。

$file = 'C:\scripts\users.csv'
$test = Import-CSV $file | Where-Object {$_.Active -like "disable*"} | Select-Object Name

foreach($user in $test){
    if (Get-AdUser -LDAPFilter "(samaccountname=*$user*)" | Select-Object Enabled){
       Write-Host $user + "is active" 
    }
}

感谢您的帮助。

编辑:我修复了语法错误,现在脚本将运行,但没有输出。我知道有些用户仍处于活动状态,因此肯定会有一些输出。

3 个答案:

答案 0 :(得分:2)

你非常接近,但我认为你需要的是Select-Object的-ExpandProperty参数。

    if ((Get-AdUser $user | Select-Object -ExpandProperty Enabled)){

否则它不是True / False的布尔响应,而是具有一个属性的对象,该属性为Enabled。该属性的值将是布尔值true / false,但如果您想要的是值,则必须先扩展属性。

编辑此外,您并不真正需要Write-Host命令(很多人会告诉您不要使用它,除非您真的想要写入屏幕而不是其他任何内容)。您可以简单地将该行添加到"$user is active",因为双引号会自动扩展字符串。

我想你可以通过以下方式进一步简化它:

get-aduser -filter {SAMAccountName -eq "$user" -and Enabled -eq $true} | ForEach{ $_.samaccountname + " is enabled." }

这将取代整个ForEach区块。

答案 1 :(得分:0)

按如下方式构建过滤器字符串

$filterstring = "samaccountname=*{0}*" -f $user

答案 2 :(得分:0)

Select-Object将返回Enabled的对象数组。您的If声明:

if(Get-ADUser disabledUser | Select-Object enabled){Write-host "Enabled"}
Enabled
那应该是假的吗?发生的事情是If评估了一个填充的语句。它不是空的,所以它是$ true

你应该做什么使用-ExpandProperty。这将从enabled获得原始值,这将正确触发if语句。

if(Get-ADUser disabledUser | Select-Object -ExpandProperty enabled){Write-host "Enabled"}