Windows 为什么乘法不适用于读取主机值
上面是我试图执行的脚本,结果如下:Windows 为什么乘法不适用于读取主机值,windows,powershell,scripting,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 th
$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”时,结果为
$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"
}
因此,问题在于
读取主机
返回一个字符串
,当与X相乘时,该字符串会重复X次。问题在于读取主机cmdlet返回的类型
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
它返回Object[]
,必要时隐式转换为其他类型。当使用二元运算符(+、-、*)时,类型也转换为第一个参数类型。对象[]
类型中没有*运算符。这就是为什么它被转换成字符串,然后相乘。如果第一个参数是int,PowerShell也会尝试将其转换为int。您可以调整代码以使用此转换规则。请看下面的脚本:
$num = read-host
$num.GetType()
它还产生:
$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
您可以这样解决您的问题:
"test" * 5 # returns testtesttesttesttest
[int]:TryParse($input\u string,[ref]$input\u number)
将尝试将输入字符串解析为整数
,并将值存储在$input\u number
中。只要失败(因为输入错误),脚本就会请求新的输入
有关更多信息,请参阅。谢谢您的回答
[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
。脚本如下所示
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)" }
比较
5*10
和'5'*10
。请选择一个有意义的问题标题。只有代码的答案是无用的。您需要解释,什么是错误的,以及您的代码如何解决这个问题-1,因为“这个答案是没有用的”。而负值也不是邪恶的。如果它被激怒了,你会怎么解释?一切都已经被别人给予了。。。对于否定,我同意,这不是错的,但什么是错的。。。。复制表从不为负值:)我的观点是,不应该拒绝负值,因为它们不会破坏脚本。至于解释,我们都试图在这里给出完整和独立的答案,就是这样。您的解释可能会引入其他解释中缺少的一些有用的细节:).666是邪恶的,它不是负值:如果用户写入的不是整数,则您的代码循环和打印结果相同,并引发错误
$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"
}