如何允许在编号菜单中进行多项选择?
How do I allow for multiple selections in a numbered menu?
这与我之前关于 FTP 时间戳的问题有关。我正在编写一个脚本,通过简化 PC 设置来帮助我以及其他人更好地完成工作。现在一切都完美无缺,除了我想让它更加自动化。现在它一次只允许做一件事。我希望能够选择多个号码,然后一个接一个 运行。
这需要在 Windows 7 中工作,而无需导入任何额外的模块。
这是我目前的情况:
echo ""
$answer = read-host "Select a number"
echo ""
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
else {write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
echo ""
我不想选择选项 2(例如),放开它,然后点击选项 3,依此类推,我想输入“2,3”(无引号),然后让它同时点击两个函数另一个。
我研究过 foreach 循环,但无法让它工作。
echo ""
$num = read-host "Select a number"
echo ""
$num.split(",")
ForEach($answer in $num){
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
}
else {write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
echo ""
我知道 Else 语句会捕获除单个 1-9 以外的任何内容。我试过评论那个部分,仍然没有。如果我选择一个数字而不是倍数,它会起作用。我也试过将数字放在引号中的 if 语句中。它还会显示我在 运行 函数或退出之前选择的数字。我不想显示任何输出。
谢谢!
更新:环顾四周后,我找到了开关参数。看起来效果不错!
do {
do {
cls
write-host ""
write-host "****************************"
write-host "** Main Menu **"
write-host "****************************"
write-host ""
write-host "1 - Uninstall Bundled Apps"
write-host "2 - Install Flash & Java"
write-host "3 - Install Adobe Reader"
write-host "4 - Install Firefox"
write-host "5 - Install Chrome"
write-host "6 - Install Office 365"
write-host "7 - Install All"
write-host ""
write-host "8 - Check for Installer Updates"
write-host ""
write-host "9 - Exit"
write-host ""
$answer = read-host "Select number(s)"
$ok = $answer -match '[123456789]+$'
if ( -not $ok) {write-host "Invalid selection"
sleep 2
write-host ""
}
} until ($ok)
switch -Regex ( $answer ) {
"1" {uninstall}
"2" {flashjava}
"3" {reader}
"4" {firefox}
"5" {chrome}
"6" {o365}
"7" {uninstall}
"8" {updates}
}
} until ( $answer -match "9" )
}
实际上你们真的很亲密。主要问题是 $num.Split()
returns 数组,但不修改 $num
,因此当您在 foreach()
循环中使用 $num
时,您正在使用原始值。看看这里的变化:
echo ""
$num = read-host "Select a number"
echo ""
$nums = $num.split(",")
ForEach($answer in $nums){
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
}
# else {write-host -ForegroundColor red "Invalid Selection"
# sleep 2
# mainmenu
# }
# commented out because this else no longer corresponds to anything
echo ""
现在稍微清理一下,让我们用 switch
看一下:
echo ""
$num = read-host "Select a number"
echo ""
$nums = $num.split(",")
ForEach($answer in $nums){
switch ($answer) {
1 {uninstall}
2 {flashjava}
3 {reader}
4 {firefox}
5 {chrome}
6 {office}
7 {reader}
8 {updates}
9 {exit}
default {
write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
}
}
echo ""
这与我之前关于 FTP 时间戳的问题有关。我正在编写一个脚本,通过简化 PC 设置来帮助我以及其他人更好地完成工作。现在一切都完美无缺,除了我想让它更加自动化。现在它一次只允许做一件事。我希望能够选择多个号码,然后一个接一个 运行。
这需要在 Windows 7 中工作,而无需导入任何额外的模块。
这是我目前的情况:
echo ""
$answer = read-host "Select a number"
echo ""
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
else {write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
echo ""
我不想选择选项 2(例如),放开它,然后点击选项 3,依此类推,我想输入“2,3”(无引号),然后让它同时点击两个函数另一个。
我研究过 foreach 循环,但无法让它工作。
echo ""
$num = read-host "Select a number"
echo ""
$num.split(",")
ForEach($answer in $num){
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
}
else {write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
echo ""
我知道 Else 语句会捕获除单个 1-9 以外的任何内容。我试过评论那个部分,仍然没有。如果我选择一个数字而不是倍数,它会起作用。我也试过将数字放在引号中的 if 语句中。它还会显示我在 运行 函数或退出之前选择的数字。我不想显示任何输出。
谢谢!
更新:环顾四周后,我找到了开关参数。看起来效果不错!
do {
do {
cls
write-host ""
write-host "****************************"
write-host "** Main Menu **"
write-host "****************************"
write-host ""
write-host "1 - Uninstall Bundled Apps"
write-host "2 - Install Flash & Java"
write-host "3 - Install Adobe Reader"
write-host "4 - Install Firefox"
write-host "5 - Install Chrome"
write-host "6 - Install Office 365"
write-host "7 - Install All"
write-host ""
write-host "8 - Check for Installer Updates"
write-host ""
write-host "9 - Exit"
write-host ""
$answer = read-host "Select number(s)"
$ok = $answer -match '[123456789]+$'
if ( -not $ok) {write-host "Invalid selection"
sleep 2
write-host ""
}
} until ($ok)
switch -Regex ( $answer ) {
"1" {uninstall}
"2" {flashjava}
"3" {reader}
"4" {firefox}
"5" {chrome}
"6" {o365}
"7" {uninstall}
"8" {updates}
}
} until ( $answer -match "9" )
}
实际上你们真的很亲密。主要问题是 $num.Split()
returns 数组,但不修改 $num
,因此当您在 foreach()
循环中使用 $num
时,您正在使用原始值。看看这里的变化:
echo ""
$num = read-host "Select a number"
echo ""
$nums = $num.split(",")
ForEach($answer in $nums){
if ($answer -eq 1){uninstall}
if ($answer -eq 2){flashjava}
if ($answer -eq 3){reader}
if ($answer -eq 4){firefox}
if ($answer -eq 5){chrome}
if ($answer -eq 6){office}
if ($answer -eq 7){reader}
if ($answer -eq 8){updates}
if ($answer -eq 9){exit}
}
# else {write-host -ForegroundColor red "Invalid Selection"
# sleep 2
# mainmenu
# }
# commented out because this else no longer corresponds to anything
echo ""
现在稍微清理一下,让我们用 switch
看一下:
echo ""
$num = read-host "Select a number"
echo ""
$nums = $num.split(",")
ForEach($answer in $nums){
switch ($answer) {
1 {uninstall}
2 {flashjava}
3 {reader}
4 {firefox}
5 {chrome}
6 {office}
7 {reader}
8 {updates}
9 {exit}
default {
write-host -ForegroundColor red "Invalid Selection"
sleep 2
mainmenu
}
}
}
echo ""