Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   перекодировка значения переменной с рус. буквами в DOS-кодировку, для передачи в cmd. (http://forum.oszone.net/showthread.php?t=349011)

9119 14-06-2021 22:19 2960280

перекодировка значения переменной с рус. буквами в DOS-кодировку, для передачи в cmd.
 
Добрый.

Код:

$text = "Проверка"
$text | cmd

результат:
Код:

????????

Как перекодировать значение переменной (с русскими буквами), чтобы в сmd передавалось правильно, а не "????????"

*нужно запустить приложение, именно через cmd, но из powersshell. В пути запуска есть русские буквы.


Нашел что-то - https://xaegr.wordpress.com/2007/01/24/decoder/
но не разобрался как пользоваться.

Помогите разобраться. Спасибо.

Iska 14-06-2021 22:48 2960282

9119, опишите Вашу задачу, а не выбранный метод решения.

9119 14-06-2021 23:04 2960283

нужно запустить приложение с большим количеством аргументов из-под PS.

Код:

$tmp1 = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1"
$yandex_tts_path = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\проект\bal4yndx"
$yandex_exe = "$yandex_tts_path\bal4yndx.exe"
$api_key_Y = "XXXXXXXXXXXXXXXXXXXXXX"
$Text1 = (get-content -encoding utf8 -path "$tmp1\выкладка.txt")[4..1000]
$alena_voice1 = "-p -k $api_key_Y -l ru-RU -n alena -s 1.0 -t $Text1 -enc utf8 -d $yandex_tts_path\dic.dic -w $tmp1\Book0001.wav"
start-process "$yandex_exe" -arg "$alena_voice1" -wait


из-под PS не стартует, ошибки нет, просто окно блымает от приложения и все, при этом тоже самое из-под сmd - работает без проблем.
*знаю что путь длинный.... и рус буквы. но тут как есть. надо решить задачу с текущими длинными путями и русскими буквами


Вот и хотел собрать весь путь в переменную и послать в сmd, но затыка с кодировкой.

Iska 14-06-2021 23:31 2960286

9119, попробуйте так:
Код:

$tmp1            = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1"
$yandex_tts_path = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\проект\bal4yndx"
$yandex_exe      = "$yandex_tts_path\bal4yndx.exe"
$api_key_Y      = "XXXXXXXXXXXXXXXXXXXXXX"
$Text1          = (Get-Content -Encoding UTF8 -Path "$tmp1\выкладка.txt")[4..1000]
$alena_voice1    = "-p", "-k", $api_key_Y, "-l", "ru-RU", "-n", "alena", "-s", "1.0", "-t", $Text1, "-enc", "utf8", "-d", "$yandex_tts_path\dic.dic", "-w", "$tmp1\Book0001.wav"

Start-Process -FilePath $yandex_exe -ArgumentList $alena_voice1 -Wait


9119 14-06-2021 23:49 2960287

Iska,

в вашем варианте поменял аргументы, т.к они идут попарно, кроме -p
Код:

$alena_voice1    = "-p", "-k $api_key_Y", "-l ru-RU", "-n alena", "-s 1.0", "-t $Text1", "-enc utf8", "-d $yandex_tts_path\dic.dic", "-w $tmp1\Book0001.wav"
но к сожалению также

Foreigner 15-06-2021 00:11 2960288

9119, Попробуйте текст передать в качестве строки (с переводом строки), а не массива строк.

Код:

$Text1 = (get-content -encoding utf8 -path "$tmp1\выкладка.txt")[4..1000] | Out-String
Или так:
Код:

$Text1 = (get-content -encoding utf8 -path "$tmp1\выкладка.txt")[4..1000] -join "`n"

9119 15-06-2021 00:29 2960291

Foreigner, попробовал, также.
даже если через ключ -f указать проге text.txt тотже эффект

Может все таки можно как-то вывести все значение в сmd?

Код:

"$yandex_exe $alena_voice1"
E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\проект\bal4yndx\bal4yndx.exe -p -k ключ -l ru-RU -n alena -s 1.0 -t ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА ТЕКСТ РОЛИКА -enc utf8 -d E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\проект\bal4yndx\dic.dic -w E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1\Book0001.wav
PS E:\!!Youtube\АРХИВ\!временное\Ролики Меган\!в работе\tmp\1>

Код:

"$yandex_exe $alena_voice1" | cmd
Microsoft Windows [Version 10.0.19042.804]
(c) Корпорация Майкрософт (Microsoft Corporation), 2020. Все права защищены.

E:\!!Youtube\АРХИВ\!временное\Ролики Меган\!в работе\tmp\1>E:\!!Youtube\?????\!?????????\?????? ?????\!? ??????\??????\bal4yndx\bal4yndx.exe -p -k AQVNzlDc64-DyrBNGhq95ANGwwHwFSAEZooHnOiX -l ru-RU -n alena -s 1.0 -t ????? ?????? ????? ?????? ????? ?????? ????? ?????? ????? ?????? ????? ?????? ????? ?????? ????? ?????? -enc utf8 -d E:\!!Youtube\?????\!?????????\?????? ?????\!? ??????\??????\bal4yndx\dic.dic -w E:\!!Youtube\?????\!?????????\?????? ?????\!? ??????\tmp\1\Book0001.wav
"E:\!!Youtube\?????\!?????????\??????" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Foreigner 15-06-2021 00:59 2960294

Цитата:

Цитата 9119
Может все таки можно как-то вывести все значение в сmd? »

Код:

Start-Process -FilePath cmd.exe -ArgumentList "/c ......" -Wait

DJ Mogarych 15-06-2021 09:32 2960309

У меня вот так работает прямо из PS:
Код:

$text = "надо решить задачу с текущими длинными путями и русскими буквами"
& "D:\Downloads\balcon\balcon.exe" -n Irina -t $text

Зачем делать столько переменных-то? Тем более, зачем делать массив из аргументов, они же должны в одну строку идти.
И сами аргументы тоже пересмотреть надо, например, -l выводит список голосов, зачем это?

Сократите по-максимуму количество аргументов и переменных, затем, тестируя каждый шаг, начинайте наращивать их количество. Так вы поймёте, где именно возникает проблема.

YuS_2 15-06-2021 14:05 2960325

9119, кроме того, использование балаболки принципиально?
Можно и так:
Код:

add-type -assem system.speech
$file = '.\test.txt'
$wav = '.\out.wav'
$synth = new-object system.speech.synthesis.speechsynthesizer
$synth.setoutputtowavefile($wav)
$synth.speak((gc $file))
$synth.setoutputtodefaultaudiodevice()


Iska 15-06-2021 22:31 2960354

Цитата:

Цитата DJ Mogarych
Тем более, зачем делать массив из аргументов, они же должны в одну строку идти. »

Это я сделал, не автор. Так проще разбираться.

Цитата:

Цитата DJ Mogarych
И сами аргументы тоже пересмотреть надо, »

Как правило, именно в этом дело. Я бы порылся, но у меня нет «bal4yndx.exe».

Цитата:

Цитата DJ Mogarych
Сократите по-максимуму количество аргументов и переменных, затем, тестируя каждый шаг, начинайте наращивать их количество. Так вы поймёте, где именно возникает проблема. »

Я бы ещё предложил пользовать Process Monitor с фильтрами на создание, запуск и завершение процесса — очень помогает отлавливать некорректно или не вполне корректно передаваемые исполняемому файлу аргументы.


Время: 22:59.

Время: 22:59.
© OSzone.net 2001-