Powershell statements


while(($dois = Read-Host 'Server Lookup Y/N') -eq 'n') {
switch($dois) {
'Y' {
do {
Clear-Host
try {
$SN = Read-Host 'Enter Server Name'
$lookup = Get-ADComputer -identity $SN -Properties memberof, dnshostname | Select-Object dnshostname, memberof |
ConvertTo-Json -Depth 100 | Out-File '.extract.json' | code .extract.json
}
catch { Write-Warning "$SN does not exist, please input a valid Server Name." }
}until($lookup)
}
'N' { Write-Host -ForegroundColor cyan 'Ending Script' }
}
exit
}

我觉得我在这件事上花了太长时间,快把我累垮了。脚本的目的是作为一个工具来拉一些服务器属性,然后导出到一个JSON文件,它工作得很好,但它不是交互式的,这就是我开始扩展,现在有问题,我添加了一个用户选项为Y/N,当我选择N脚本执行预期但问题,当他们选择选项Y,在导出结束时,shell一直要求输入服务器名称,但我想要的是shell在最初运行脚本时提供服务器查找y/n选项,当他们输入错误的服务器名称时也不会触发警告。

当前代码的主要问题,until($lookup)将无限循环,因为$lookup将始终为空,因为Out-File不产生任何输出。您可以在try块的末尾使用布尔值尝试以下操作,如果Get-ADComputer没有失败,那么您可以确保文件有输出。

$lookup = $false
switch($dois) {
'Y' {
do {
try {
$SN = Read-Host 'Enter Server Name'
Get-ADComputer -identity $SN -Properties memberof, dnshostname |
Select-Object dnshostname, memberof |
ConvertTo-Json -Depth 100 |
Out-File '.extract.json'
# signal to stop the `do` loop
$lookup = $true
}
catch {
Write-Warning "$SN does not exist, please input a valid Server Name."
}
}
until($lookup)
}
'N' {
....
}
}

我个人会使用这样的东西,.PromptForChoice有助于确保用户选择有效的选项(YN),并使用try/catch语句来验证计算机的存在。如果cmdlet无法找到具有所提供输入的计算机,则将导出nothing。同样值得注意的是,如果用户决定继续查询更多的服务器,那么extract.json将在每次循环迭代时被覆盖(假设可以找到一台计算机)。

# should we enter this loop? if `No` then the script just exits
while($Host.UI.PromptForChoice('', 'Server Lookup?', ('&Yes', '&No'), 0) -eq 0) {
try {
$sn = Read-Host 'Enter Server Name'
Get-ADComputer $sn -Properties memberof, dnshostname |
Select-Object dnshostname, memberof |
ConvertTo-Json -Depth 100 |
Set-Content '.extract.json'
# `Out-Content` and `Set-Content` don't produce output
# hence the pipe to `code` was incorrect
code .extract.json
}
catch {
# if the user input was not valid or the computer couldn't be found
Write-Warning "Input is invalid or '$sn' does not exist."
}
}

相关内容

  • 没有找到相关文章

最新更新