繁体   English   中英

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

[英]Pass a variable as a switch parameter in Powershell

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

喷溅是实现这一目标的方法。 之所以如此命名,是因为您使用@而不是$来引用一个变量,而@看起来像是“splat”。

它通过创建一个哈希表来工作,哈希表是一种字典(键/值对)。 在 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的左侧而不是里面,但这是您的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM