Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 用户输入的循环类似于批处理文件中的goto_Loops_Powershell_Goto - Fatal编程技术网

Loops 用户输入的循环类似于批处理文件中的goto

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.

我对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.

#
#
# 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认为如果我除以它,它一定是一个数字,所以我不必在那里声明它


我希望这能让剧本现在更有意义

这似乎很好,但我真的在底部迷路了。我对整个陈述感到非常困惑。我真的很感谢你的解释。