我试图创建一个PowerShell脚本,将抓住所有启用的Active Directory帐户,和非活动期为90天。该脚本将提示用户在查询计算机或用户帐户之间进行选择。 根据选择,它将作为变量传递给主命令。
如果我不传递变量,这些命令将正常工作。
我不知道如果我想要做的是可能的。
对不起,任何错误的代码格式。刚开始。
Clear-Host
write-host "`nProgram searches for Enabled AD users account that have not logged in for more than 90 days. `nIt searches the entire domain and saves the results to a CSV file on users desktop." "`n"
$choice = Read-host -Prompt " What do you want to search for Computer or Users Accounts`nType 1 for users`nType 2 for Computers`n`nChoice"
$account
if ($choice -eq 1){
$account = UsersOnly
}
Elseif($choice -eq 2){
$account = ComputersOnly
}
Else{
write-host "This is not an option `n exiting program"
exit
}
$FileName = Read-Host -Prompt "What do you want to name the CSV file"
$folderPath = "$env:USERPROFILE\Desktop\$FileName.csv"
Search-ADAccount -AccountInactive -TimeSpan 90 -$account | Where-Object { $_.Enabled -eq $true } | select Name, UserPrincipalName, DistinguishedName | Export-Csv -Path $folderPath
答案 0 :(得分:4)
Splatting是实现此目标的方法。之所以这样命名,是因为您使用@
而不是$
引用了一个变量,并且@
的类型看起来像是“飞溅”。
它通过创建一个哈希表来工作,哈希表是一种字典(键/值对)。在PowerShell中,我们使用@{}
创建哈希表文字。
要使用splatting,您只需创建一个哈希表,其中每个键/值对分别是参数名称和值。
因此,例如,如果您想致电Get-ChildItem -LiteralPath $env:windir -Filter *.exe
,也可以这样进行:
$params = @{
LiteralPath = $env:windir
Filter = '*.exe'
}
Get-ChildItem @params
您还可以将直接参数与splatting混合并匹配:
$params = @{
LiteralPath = $env:windir
Filter = '*.exe'
}
Get-ChildItem @params -Verbose
当您需要有条件地省略参数时,这是最有用的,因此您可以打开它:
if ($executablesOnly) {
Get-ChildItem -LiteralPath $env:windir -Filter *.exe
} else {
Get-ChildItem -LiteralPath $env:windir
}
对此:
$params = @{
LiteralPath = $env:windir
}
if ($executablesOnly) {
$params.Filter = '*.exe'
}
Get-ChildItem @params
或者这个:
$params = @{}
if ($executablesOnly) {
$params.Filter = '*.exe'
}
Get-ChildItem -LiteralPath $env:windir @params
只有2种可能的选择,if
/ else
看起来并不那么糟糕,但是随着您选择的增加和变得越来越复杂,它变得噩梦。
您的情况:首先要注意一件事。您要替代的参数是开关参数。这意味着当您提供它们时,通常仅提供参数名称。实际上,这些名称采用的布尔值在提供名称时默认为true。实际上,您可以覆盖它们,因此可以执行Search-ADAccount -UsersOnly:$false
,但这是非典型的。
无论如何要提到的一点是,它可能会混淆您如何出于散布目的而在哈希表中设置其值,但是简单的答案只是给他们一个布尔值(通常是$true
)
因此,只需简单地更改代码即可:
$account = if ($choice -eq 1) {
@{ UsersOnly = $true }
} elseif ($choice -eq 2) {
@{ ComputersOnly = $true }
}
# skipping some stuff
Search-ADAccount -AccountInactive -TimeSpan 90 @account
我还将$account
分配放在if
的左侧而不是内部,但这是您的选择。