Pull to refresh

Как же все-таки пользоваться PowerShell?

Reading time3 min
Views42K
Навеяно q&a: Как воспроизвести mp3 из командной строки в Windows 7?

Немного шокирован предлагаемыми ответами, которые сводятся к 'скачать и установить дополнительное ПО'… и так в системе уже под 20Гб какого то говна чего то полезного, которое зовется операционной системой… извиняюсь, вырвалось.

Когда то в Windows XP использовал для этой задачи простейшую утилиту mplay, хоть и GUI но планировщиком задач нормально запускается, но в Windows 7 удалили его и даже sndrec32. Запускать монстроуозный wmplayer считаю глупостью, поэтому приходится обращаться к скриптовым языкам.

Примеры однострочных скриптов на vbs для windows scripting host можно нарыть в интернете, вот простейший пример:
Set oVoice = CreateObject("SAPI.SpVoice")
set oSpFileStream = CreateObject("SAPI.SpFileStream")
oSpFileStream.Open "c:\Windows\Media\tada.wav"
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close

Кстати, это чудо, что код заработал на windows 7, так как по сравнению с windows xp ряд activex объектов исчезло (типа WMPlayerClass) и никто не знает, когда исчезнет или как изменится класс SAPI, да и не дело это, микроскопом гвозди забивать. Поэтому это решение считаю неправильным и не логичным, да и отмирает ActiveX потихоньку, вполне логично убиваемый .NET окружением.

Попробовал решить задачу новомодным PowerShell (не умею готовить, но специально порылся в документации), у меня волосы дыбом встали от того, как там сочетаются замечательные идеи с ужасной реализацией. Например нет нормальной возможности запустить скрипт из командной строки не создав и не подписав файл (я все понимаю, безопасность превыше всего, как результат вопросы, стоит ли этим пользоваться).

Вот простейший код:
$s=new-Object System.Media.SoundPlayer;$s.SoundLocation='C:\Windows\Media\tada.wav';$s.Play();
Прекрасно работает внутри powershell, если его вставить и выполнить вручную!

Но вот таким образом:
powershell -Command $s=new-Object System.Media.SoundPlayer;$s.SoundLocation='C:\Windows\Media\tada.wav';$s.Play();
Ничего не происходит, потому как каждая команда выполняется в своем контексте (т.е. на каждом шаге $s не определено).

Попробовал воспользоваться перенаправлением:
echo $s=new-Object System.Media.SoundPlayer;$s.SoundLocation='C:\Windows\Media\tada.wav';$s.Play(); | powershell -command -
И был шокирован результатом — был запущен зарегистрированный плеер по умолчанию на wav файл (у меня это оказался winamp). С какой стати?

А без использования -command -:
echo $s=new-Object System.Media.SoundPlayer;$s.SoundLocation='C:\Windows\Media\tada.wav';$s.Play(); | powershell
Происходит простой запуск PowerShell с ожиданием ввода команд.

Ладно, сдаюсь, пробуем разрешить не подписанные скрипты (запускаем под привилегированным шелом):
powershell Set-ExecutionPolicy Unrestricted
Создаем и запускаем файл с вышепредложенным кодом (поместив его в c:\a.ps1):
powershell c:\a.ps1
И ничего не получаем! Тишина, и никаких сообщений об ошибке (при не разрешенным запуске не подписанных скриптов получаю соответствующее сообщение).

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

UPD от TheBits и Paul: Слона то я и не приметил, скрипт завершает работу не доиграв, а запуск кода из командной строки можно организовать с помощью групировки и символа &:
powershell -Command "& {$s=new-Object System.Media.SoundPlayer; $s.SoundLocation='C:/Windows/Media/tada.wav'; $s.Play(); Sleep -Seconds 9}"


UPD2 На основе еще ряда комментариев: Окончательное решение, само собой может быть таким, с учетом автоматического определения длительности файла и исключением переменной $s:
powershell -Command (new-object Media.SoundPlayer "C:\Windows\Media\notify.wav").playsync();
Но самое главное, так и не решает первоначальную задачу — System.Media.SoundPlayer не умеет играть mp3 файлы, т.е. нужно что то посложнее ваять, но я и не задумывался целью этого поста ставить решение оригинальной задачи.
Tags:
Hubs:
+4
Comments32

Articles