首页 > 解决方案 > 如何防止随机输出?

问题描述

当我运行我的脚本时,它会添加一个我没有请求的输出。

$input = Read-Host -p "Message?";
$morseFile = Get-Content C:\Users\lukas.downes\Documents\Script\morse.csv
$letter;
$code;
$outputAsString = "";


for ($j = 0; $j -lt $input.Length; $j++)
{
    for ($i = 1; $i -lt $morseFile.Length; $i++)
    { 
        $letter = ([string]$morseFile[$i]).Split(',')[0];
        $code = ([string]$morseFile[$i]).Split(',')[1];

        if ($input[$j] -eq $letter) 
        {
            $outputAsString += $code;
            write-host ("" + $letter + ": " + $code)
        }

    }
}

Write-Host $outputAsString

这输出:

> Message?: sos 
> Z
> --.. 
> S: ... 
> O: --- 
> S: ... 
> ...---...

这很奇怪,因为我什至没有在我的脚本中使用“Z”。

标签: powershellscripting

解决方案


如果您的输入 csvmorse.csv看起来像这样:

Letter,Code
O,---
P,.--.
Q,--.-
R,.-.
S,...

那么这应该适合你:

# import the csv as array of objects
$codes = Import-Csv -Path 'C:\Users\lukas.downes\Documents\Script\morse.csv'
# for more speed, change this array of objects into a lookup Hashtable
$morse = @{}
foreach ($item in $codes) {
    $morse[$item.Letter] = $item.Code
}

$inputString = Read-Host -p "Message?"
if (![string]::IsNullOrWhiteSpace($inputString)) {
    $inputString.ToUpper().ToCharArray() | ForEach-Object {
        '{0}: {1}' -f $_, $morse[$_.ToString()]  # or: $morse["$_"]
    }
}

输入“sos”时,输出为:

S: ...
O: ---
S: ...

PS 不要$input用作自定义变量,因为它是自动变量


推荐阅读