Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
Windows 为什么乘法不适用于读取主机值_Windows_Powershell_Scripting - Fatal编程技术网

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"
        }