Loops 用户输入的循环类似于批处理文件中的goto
我对power shell是新手。我正在尝试在批处理文件中使用goto这样的函数 在我的脚本中,我有$input1=Read Host,请选择选项1、2、3。 如果使用未输入1、2、3,我希望清除主机并重新启动脚本Loops 用户输入的循环类似于批处理文件中的goto,loops,powershell,goto,Loops,Powershell,Goto,我对power shell是新手。我正在尝试在批处理文件中使用goto这样的函数 在我的脚本中,我有$input1=Read Host,请选择选项1、2、3。 如果使用未输入1、2、3,我希望清除主机并重新启动脚本 Write-Host 1. Convert Byte to Megabyte. Write-Host Write-Host 2. Convert Byte to Gigabyte. Write-Host Write-Host 3. Conver Byte to Terabyte.
Write-Host 1. Convert Byte to Megabyte.
Write-Host
Write-Host 2. Convert Byte to Gigabyte.
Write-Host
Write-Host 3. Conver Byte to Terabyte.
#
#
# Assign value to the variables
#
$b2MB = '1048576'
$b2GB = '1073741824'
$b2TB = '1099511627776'
$input1 = ""
#
#
# prompts user for input from the main screen.
#
$input1 = Read-Host "Please select an option 1, 2, 3. "
#
#
# Depending on what the user input will execute a certain conversion.
#
#
if ( $input1 -eq 1 ) {
$mb2 = Read-Host " Enter how many bytes you want to convert to Megabytes? "
$bytesToMb = $mb2 / $b2MB
Write-Host $mb2 'is equal to '$bytesToMb' Megabytes'
} elseif ($input1 -eq 2) {
$mb3 = Read-Host " Enter how many bytes you want to convert to Gigabytes? "
$bytesToGb = $mb3 / $b2GB
Write-Host $mb3 'is equal to '$bytesToGb' Gigabytes'
} elseif ( $input1 -eq 3) {
$mb4 = Read-Host " Enter how many bytes you want to convert to Terabytes? "
$bytesToTb = $mb4 / $b2TB
Write-Host $mb4 'is equal to '$bytesToTb' Terabytes'
} else {
Write-Host " You have entered an invalid option. "
}
我相信你想要这样的东西:
开始一个连续的循环
而$true{
写消息
写入主机1。将字节转换为兆字节。
写主机
写入主机2。将字节转换为千兆字节。
写主机
将主机3.转换字节写入TB。
获取输入
$input1=读取主机请选择选项1、2、3。
查看输入是否等于1、2或3。如果是,则中断循环。
if 1..3-包含$input1{break}
如果我们到了这里,输入就不好了。
因此,我们清除主机,让循环重新开始
清除主机
}
给变量赋值
$b2MB='1048576'
$b2GB='1073741824'
$b2TB='109951162776'
取决于用户输入将执行的特定转换。
如果$input1-等式1{
$mb2=读取主机输入要转换为兆字节的字节数?
$bytesToMb=$mb2/$b2MB
写入主机$mb2'等于'$bytesToMb'兆字节'
}其他$input1-等式2{
$mb3=读取主机输入要转换为GB的字节数?
$bytesToGb=$mb3/$b2GB
写入主机$mb3'等于'$bytesToGb'千兆字节'
}其他$input1-等式3{
$mb4=读取主机输入要转换为TB的字节数?
$bytesToTb=$mb4/$b2TB
写入主机$mb4'等于“$bytesToTb”TB”
}否则{
写入主机您输入的选项无效。
}
很简单,使用Do/Until循环
#
#
# Assign value to the variables
#
$input1 = ""
# Start the loop to get the user's choice (with validation)
Do{
cls
Write-Host 1. Convert Byte to Megabyte.
Write-Host
Write-Host 2. Convert Byte to Gigabyte.
Write-Host
Write-Host 3. Conver Byte to Terabyte.
#
#
# prompts user for input from the main screen.
#
$input1 = Read-Host "Please select an option 1, 2, 3. "
}Until(@(1,2,3) -contains $input1)
Switch($input1){
1 {Read-Host "Enter how many bytes you want to convert to Megabytes? "|%{$Out = "{0:N} bytes is equal to {1:n4} Megabytes" -f [double]$_,($_/1MB);Write-Host "$Out"}}
2 {Read-Host "Enter how many bytes you want to convert to Gigabytes? "|%{$Out = "{0:N} bytes is equal to {1:n4} Gigabytes" -f [double]$_,($_/1GB);Write-Host "$Out"}}
3 {Read-Host "Enter how many bytes you want to convert to Terabytes? "|%{$Out = "{0:N} bytes is equal to {1:n4} Terabytes" -f [double]$_,($_/1TB);Write-Host "$Out"}}
}
我还使用了一个开关而不是一堆If/Then语句,并使用/1MB或/1GB或/1TB进行了计算,因为Powershell可以为您进行计算
编辑:哦,是的,我还格式化了数字。添加逗号可以更容易地读取大数字,我将计算值截断为小数点后4位。这可以通过将{1:n4}中的4更改为您希望小数指向的任何值,或者删除4以包含所有内容来改变。如果你把它设为一个大的小数点,如果没有那么多小数点,它将用零填充。例如,当通过{1:n5}格式化时,4.23将显示为4.23000,因为它必须在小数点后有5位
好的,使用Switch循环,而不是像您使用的那样使用嵌套if语句。语法是
要分析的Switcharray{
值或脚本块{要在匹配时执行的操作}
不同的值或脚本块{要对匹配执行的操作}
}
所以在您的例子中,我们只解析一件事,那就是用户选择。假设他们选择2来转换成千兆字节$输入2=2。开关从顶部开始比较,并检查值是否为1。事实并非如此,它将移动到下一行。它检查值是否为2。是的,因此switch命令执行相应脚本块中的操作。我们马上就到。完成脚本块后,它移动到下一行并检查值是否为3。它不是,这是最后一个选项,所以它完成了循环。由于$input2只有一个值,因此没有其他值需要解析,因此它退出开关循环。Switch在阵列上工作,因此可能有更多的东西可以与Switch循环中的三个选项进行比较
这就是开关回路。让我们看看当第二个选项的值匹配时它运行的scriptblock。我会在这里把它分解一下
Read-Host "Enter how many bytes you want to convert to Gigabytes? "|
%{
$Out = "{0:N} bytes is equal to {1:n4} Gigabytes" -f [double]$_,($_/1GB);
Write-Host "$Out"
}
如果我没记错的话,第一行基本上是您的,但是我没有将值存储在变量中以备以后使用,而是将它通过管道传输到for-each循环%{…}是foreach{…}的缩写。然后,因为write host不允许格式化,所以我进行了一些格式化,并将字符串保存在$out中。所以这可能会让人感到害怕。{0:N}与-f一起工作,后者是-format的缩写。它的工作原理与占位符类似,占位符要求查看字符串末尾的-f命令,并获取powershell数组中提供给它的第一个内容从记录0开始,因此对项0的引用通常会查找第一个项。一旦得到-f后面的第一个值,它就会应用冒号N后面指定的格式,这意味着它会将其格式设置为一个数字,每三位数字加一个逗号
好的,这里有一些文本,然后是另一个格式占位符{1:N4}。冒号前的部分指定要获取的项,由于0是要格式化的第一个值,因此1必须是第二个值。因此它获取第二个值并在冒号之后应用格式。N4再次表示它是一个数字,但指定仅显示小数点后的前4个数字
然后是-f,表示有一些东西需要格式化。第一项是$\这是用户输入的值,该值通过管道传输到foreach循环中。我面前的[替身]
t指定对象的类型。Double是一种数字,与int32或hex类似,但它有非常宽松的指导原则,因此用户可以输入非常大的值,而不会出现问题。直接传递给第一个占位符。然后是$\uU1/1GB,这是用户输入的除以GB的数字,因为powershell内置了这种功能。它找到结果并将其传递给第二个占位符。现在我们有了要传递给用户的文本,数字格式很好,易于阅读,并将该字符串存储到$out中。脚本块中的最后一件事是将$out写入主机
现在您可能会问,为什么我第一次必须将$指定为[double],而不是第二次。原因是第二次我对它进行数学运算时,powershell认为如果我除以它,它一定是一个数字,所以我不必在那里声明它
我希望这能让剧本现在更有意义 这似乎很好,但我真的在底部迷路了。我对整个陈述感到非常困惑。我真的很感谢你的解释。