powershell - 在 Powershell 中将变量作为开关参数传递

标签 powershell active-directory

我正在尝试创建一个 powershell 脚本,该脚本将获取所有已启用且 90 天处于非事件状态的 Active Directory 帐户。该脚本将提示用户在查询计算机或用户帐户之间进行选择。
根据选择,它会将其作为变量传递给主命令。

如果我不传递变量,命令将正常工作。

我不确定我正在尝试做的事情是否可行。

抱歉任何错误的代码格式。刚出道。

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

最佳答案

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 的 bool 值。你实际上可以覆盖它们,所以你可以做 Search-ADAccount -UsersOnly:$false但这是不典型的。

无论如何,要提到的一点是,您可能会混淆如何在散列表中设置它的值以用于散布目的,但简单的答案是给它们一个 bool 值(通常是 $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 左侧的赋值而不是里面,但那是你的选择。

关于powershell - 在 Powershell 中将变量作为开关参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54489200/

相关文章:

c# - PowerShell 中的 Linq.First 等价物是什么?

spring-security - Spring ActiveDirectoryLdapAuthenticationProvider handleBindException - 提供的密码无效错误

c++ - ldap_search 函数使用 c++ Win32 api 返回错误代码 10?

ssl - 通过 SSL 使用 AD LDS

powershell - 从 Select-Object 语句连接两个属性

PowerShell Start-Service 无休止地运行

c# - Azure Active Directory 授权代码

azure - 如何将 Azure AD (Active Directory) B2C 与现有 Azure 应用服务集成?

powershell - 删除未锁定(正在使用)的文件

sql-server - 如何在 PowerShell 中返回对象的第二列/属性?