为什么乘法不适用于Read-Host值

时间:2016-07-16 10:30:50

标签: windows powershell scripting

$table_num = Read-Host -Prompt 'Enter the table number you want to get printed'
for ($i=1; $i-lt 11; $i++){
    $ans = ($table_num*$i)
    write "$table_num*$i=$ans"
}

上面是我试图执行的脚本,我得到如下结果:

Enter the table number you want to get printed: 5
5*1=5
5*2=55
5*3=555
5*4=5555
5*5=55555
5*6=555555
5*7=5555555
5*8=55555555
5*9=555555555
5*10=5555555555

我不熟悉脚本并帮助我处理代码。

5 个答案:

答案 0 :(得分:1)

由于你没有指出预期的行为是什么,我不确定我是否解决了你的问题,但我想你想要这样的事情

$table_num_str = Read-Host -Prompt 'Enter the table number you want to get printed'
$table_num = [int]::Parse($table_num_str)
for ($i=1; $i-lt 11; $i++){
    $ans = ($table_num*$i)
    write "$table_num*$i=$ans"
} 

当输入'5'时会产生

Enter the table number you want to get printed: 5
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
5*10=50

所以问题是Read-Host返回string,当与X相乘时会导致该字符串重复X次。

答案 1 :(得分:1)

问题在于Read-Host cmdlet返回的类型。

$num = read-host
$num.GetType()

返回Object[],如果需要,它会隐式转换为其他类型。当使用二元运算符(+, - ,*)时,Type也会转换为第一个参数类型。 object[]类型中没有*运算符。这就是为什么它被转换为字符串然后成倍增加的原因。如果第一个参数是int,PowerShell也会尝试将其转换为int。您可以调整代码以使用此转换规则。看看下面的脚本:

$table_num = Read-Host -Prompt 'Enter the table number you want to get printed'
1..10 | % { write "$table_num*$_=$($_*$table_num)" }

它还产生:

5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
5*10=50

答案 2 :(得分:0)

感谢您的回答!!

实际上我添加了数据类型int。脚本很好,如下所示。

$table_num = Read-Host -Prompt 'Enter the table number you want to get printed'

        For ($i=1; $i-lt 11; $i++){
        $ans = ([int]$table_num*$i)
            write "$table_num  *  $i =  $ans"
        }

答案 3 :(得分:-1)

要进行工作计算,您需要一个数字,而不是字符串。

乘以字符串会产生这种结果:

"test" * 5 # returns testtesttesttesttest

您可以像这样解决问题:

[int]$input_number = $null

$input_string = Read-Host -Prompt 'Enter the table number you want to get printed'

while(-not [int]::TryParse($input_string, [ref]$input_number)) {
    $input_string = Read-Host -Prompt 'Please enter a number'
}

for ($i = 1; $i -lt 11; $i++) {
    $ans = ($input_number * $i)
    Write-Host "$input_number * $i = $ans"
}

[int]::TryParse($input_string, [ref]$input_number)将尝试将输入字符串解析为integer并将值存储在$input_number中。只要失败(由于输入错误),脚本就会要求输入新内容。

有关其他信息,请参阅this other question

答案 4 :(得分:-2)

do {
    $table_num = read-host "Enter the table number you want to get printed"
    $a = ""
    if( ![int32]::TryParse( $table_num , [ref]$a ) ) {
        Write-Host "Only integers please"
    }
} until ($a -gt 0)

1..10 | % { Write-Host "$table_num*$_=$($_*$table_num)" }