gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:53:55 67 4
gpt4 key购买 nike

我正在尝试创建一个 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/

67 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com