Как предотвратить случайный вывод?

#powershell #scripting

Вопрос:

Когда я запускаю свой скрипт, он добавляет выходные данные, которые я не запрашивал.

 $input = Read-Host -p "Message?";
$morseFile = Get-Content C:Userslukas.downesDocumentsScriptmorse.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» в своем сценарии.

Комментарии:

1. Удалите строки $letter; и $code; — переменные в PowerShell не требуют объявления, и вывод мусора, который вы видите, скорее всего, является содержимым этих переменных из последнего запуска.

2. Это morse.csv действительно файл CSV (значения, разделенные запятыми)? Есть ли у него заголовки?

Ответ №1:

Если ваш входной csv morse.csv выглядит примерно так:

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

Тогда это должно сработать для вас:

 # import the csv as array of objects
$codes = Import-Csv -Path 'C:Userslukas.downesDocumentsScriptmorse.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: ...
 

P.S. Не используйте $input как самостоятельную переменную, потому что это автоматическая переменная