ошибка определения массива в скрипте, он работает, если он напечатан - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь создать аудио переключатель. Я писал это раньше, но новые обновления ОС и DLL заставили меня переписать его, метод, который я использовал ранее, похоже, больше не работает. Так что прямо из ворот моя первая строка выплевывает эту ошибку:

$audio : The term '$audio' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that 
the path is correct and try again.
At D:\audiochanger.ps1:1 char:1
+ $audio = Get-AudioDevice -playback
+ ~~~~~~~
    + CategoryInfo          : ObjectNotFound: ($audio:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

, но если я наберу $audio = Get-AudioDevice -playback и затем позвоню $audio, все будет работать отлично. Что происходит?

$audio = Get-AudioDevice -playback
$audio.Name
if ($audio.Name -eq 'Speakers (Realtek High Definition Audio)') {
set-audiodevice 1 
}  Else {
set-audiodevice 2
}

выход Get-AudioDevice -playback


Index   : 2
Default : True
Type    : Playback
Name    : Speakers (Realtek High Definition Audio)
ID      : {0.0.0.00000000}.{2aa2a27b-4ebc-4355-bdf7-093a8f97ba46}
Device  : CoreAudioApi.MMDevice

or

Index   : 1
Default : True
Type    : Playback
Name    : Speakers (Logitech G533 Gaming Headset)
ID      : {0.0.0.00000000}.{1f5d6b65-fe9b-4bda-9508-d1a204149395}
Device  : CoreAudioApi.MMDevice

это работает на windows 10 и powershell 5. Мой предыдущий рабочий код можно найти здесь: необходимо выбрать элемент на основе имени в массиве, используя powershell

1 Ответ

3 голосов
/ 06 апреля 2019

Единственное правдоподобное объяснение состоит в том, что в вашем файле скрипта есть невидимые управляющие символы до $audio.

Если ваша строка действительно начинается с $audio = ..., это будет интерпретировано как присвоение , как и предполагалось;вместо этого то, что выглядит как $audio, интерпретируется как имя команды , что означает, что $ на самом деле не является первым символом.

Выможет воспроизвести проблему следующим образом:

[char] 0x200b + '$audio = Get-AudioDevice -playback' > t.ps1
./t.ps1

Выше приведена ошибка, которую вы видели из-за невидимого управляющего символа U+200B ( ZERO WIDTH SPACE )) перед $audio.

Хотя этот конкретный управляющий символ является лишь примером, вы можете проверить фактические символы в первой строке вашего скрипта следующим образом:

 & { 
   [int[]] [char[]] $Args[0] | % { '0x{0:x} [{1}]' -f $_, [char] $_ } 
 } (get-content D:\audiochanger.ps1)[0]

Решение состоит в том, чтобы удалить невидимые символы;следующие могут работать, в зависимости от того, какие символы на самом деле присутствуют в вашем случае:

 (Get-Content D:\audiochanger.ps1) -replace '\p{Cf}' > D:\audiochanger.CleanedUp.ps1

Regex \p{Cf} соответствует всем экземплярам невидимых управляющих символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...