Показать полную графическую версию : [решено] Удалить в текстовом файле все строки кроме одной нужной.
Не проверялось »
да, это похоже то, что нужно... работает. и текст в одну строку переводится, без пробелов.
Окно только под себя настрою, дабы текст можно было удобнее редактировать.
Iska, можно проще поступить (без окон) и бейсик не привлекать:
как это совместить с вариантом предложенным на предыдущей странице? »
достаточно чтобы скрипт стал на паузу и запросил ввод текста »
$json = Get-Content text.json | ConvertFrom-Json
$json.input.text = read-host "Пожалуйста, введите или вставьте из буфера текст"
$json | ConvertTo-Json | Set-Content new.json
YuS_2, не то. Из-под консоли — Read-Host консольный будет, плюс лишнее действие нужно.
работает. и текст в одну строку переводится, без пробелов »
заметил, что если запускать скрипт с текстом в буфере (скажем 5000 символов), то весь текст уже в поле ввода (что, к слову очень удобно)...
Но если при этом стать в это поле, и нажать "вставить", вставляется только малое количество текста (500-1000 символов)
По умолчанию какое-то ограничение на кол-во символов для InputBox?
Из-под консоли — Read-Host консольный будет, плюс лишнее действие нужно. »
Почему не то? Вроде, как раз, это и требовалось... там я процитировал. Окно никаких преимуществ, всё равно, не даст ведь.
А какое лишнее действие? Ровно столько же, как и в окне.
Вроде, как раз, это и требовалось »
нужны были разные варианты, но предпочтительнее все таки окно отдельное.
Планирую в нем сделать листбоксы и для настройки других параметров в text.json.
Помогите разобраться с вводом текста в поле, пож.
Пример: копируем из статьи 3 абзаца. Между абзацами - пустые строки (1-3 пустых строки).
Вставляем в поле - вставляется только первый абзац, т.е все символы до первой пустой строки.
Если предварительно сделать все 3 абзаца в 1 строку - то в поле вставляется весь текст.
1) Как-то можно побороть такое неудобство, чтобы не нужно было каждый раз в 1 строку все делать, чтобы это было автоматом при вставке?
2) Поле для ввода текста очень узкое (в 1 строку буквально). Когда вставляешь туда много текста - редактировать его там очень неудобно.
Хотелось бы иметь 8-10 строк высоты.. в идеале с возможностью скрола.
Пробовал задавать ширину и высоту поля ввода. Ширина тянется, а вот высота - нет.
$p='E:\11\bin'
$json = Get-Content $p\text.json | ConvertFrom-Json
Add-Type -assembly System.Windows.Forms
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='google text-to-speech'
$main_form.Width = 500
$main_form.Height = 500
$main_form.AutoSize = $true
$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Width = 450
$TextBox.AutoSize = $true
$TextBox.Location = New-Object System.Drawing.Point(50,200)
$TextBox.Text = Get-Clipboard -Format Text
$main_form.Controls.Add($TextBox)
$button = New-Object System.Windows.Forms.Button
$button.Text = 'OK'
$button.Location = New-Object System.Drawing.Point(400,250)
$button.add_Click({Click_Button});
$main_form.Controls.Add($button)
function Click_Button
{
$json.input.text = $TextBox.Text
$json | ConvertTo-Json | Set-Content $p\text.json
}
$main_form.ShowDialog()
YuS_2, InputBox даёт возможность зараз подставить умолчальное значение из Буфера обмена. И не во всех ОС работает вставка в окно консоли без предварительных настроек.
9119, с предыдущей страницы: Создание настраиваемого поля ввода - PowerShell | Microsoft Docs (https://docs.microsoft.com/ru-ru/powershell/scripting/samples/creating-a-custom-input-box?view=powershell-7.1).
Iska, я изучил эту информацию и не только ее...
все дело в том, что как не крути не получается у меня сделать в несколько строк это.
Пробовал через TextBox, ListBox. ComboBox.
Все время одна строка... (
upd: решил.
$TextBox.Multiline = $True;
Но, все же непонятно как добавить скрол, если вставленный текст весь не виден в окне (приходится опускаться/подыматься стрелками клавы)
Также в данном поле не работает почему-то сочетание ctrl+a, например.
Если владеете инфой - объясните на пальцах, пож.
нужны были разные варианты, но предпочтительнее все таки окно отдельное.
Планирую в нем сделать листбоксы и для настройки других параметров в text.json. »
Ну, это уже другое дело. Раз уж нравится больше настраиваемая форма, то надо в условия задачи это и вписать...
InputBox даёт возможность зараз подставить умолчальное значение из Буфера обмена. »
Это, как раз, не проблема, один условный блок всё решает...
И не во всех ОС работает вставка в окно консоли без предварительных настроек. »
С этим уже хуже. Но и ТС, вроде уточнил, что форма подходит больше...
Но, все же непонятно как добавить скрол, если вставленный текст весь не виден в окне (приходится опускаться/подыматься стрелками клавы) »
View Multiple Lines in TextBox Control - Windows Forms .NET Framework | Microsoft Docs (https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-view-multiple-lines-in-the-windows-forms-textbox-control?view=netframeworkdesktop-4.8)
Также в данном поле не работает почему-то сочетание ctrl+a, например. »
Если задано свойство .Multiline — не работает. Вроде как старый, известный баг. Который то «лечится», то возвращается заново.
Косо-криво на верхнем уровне можно обойти своим обработчиком:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles()
$oForm = New-Object System.Windows.Forms.Form
$oForm.Text = 'Sample form'
$oForm.Size = New-Object System.Drawing.Size(300,200)
$oForm.StartPosition = 'CenterScreen'
$oTextBox = New-Object System.Windows.Forms.TextBox
$oTextBox.Location = New-Object System.Drawing.Point(10,40)
$oTextBox.Size = New-Object System.Drawing.Size(260,80)
$oTextBox.Multiline = $true
$oTextBox.AcceptsReturn = $true
$oTextBox.WordWrap = $false
$oTextBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Both
$oTextBox.Add_KeyDown({
if ($_.Modifiers -eq [System.Windows.Forms.Keys]::Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::A) {
$oTextBox.SelectAll()
}
})
$oForm.Controls.Add($oTextBox)
$oForm.Add_Shown({$oTextBox.Select()})
$oForm.ShowDialog()
Это, как раз, не проблема, один условный блок всё решает... »
Поясните примером.
Поясните примером. »
типа:
...
$json.input.text = if ($a = get-clipboard){$a}else{read-host "Пожалуйста, введите или вставьте из буфера текст"}
...
YuS_2, спасибо, ясно. В этом случае мы не видим промежуточный текст.
Спасибо всем кто отозвался!
Впринципе результат удовлетворительный и тему можно помечать как решенную, но все же попрошу помощи в оптимизации "написанного").
А именно: (опишу процесс, чтобы было более понятно)
Все делается в PS (GUI для работы с google text-to-speech):
1) через окно пишем нужные параметры в text.json для последующего запроса на сервак.
2) Шлем запрос на сервак, ответ сервака пишем в source.txt
здесь таймаут (ждем пока пишется ответ с сервака)
3) Корректируем source.txt как надо и пишем результат в out.txt
здесь таймаут (ждем обработки п.3)
4) Еще корректируем нюансы и пишем полученное в out1.txt
здесь таймаут (ждем отработки п.4)
5) Перекодируем out1.txt в конечный файл mp3.
Нужно как-то убрать таймауты... А вот как- ума не приложу.
Поясню - тестил на небольших статьях на 2 минуты, поставил после п2 таймаут в 10 сек, работает корректно. Но если этот текст будет минут на 15-20, то уже 10сек таймаута будет мало..п.3 начнется раньше, чем будет записан source.txt.... и будет ошибка на выходе.
Надеюсь понятно объяснил...(
p.s. крутится идея как-то привзязаться к наличию и размеру txt файлов (например, если source.txt создан и размер его больше чем 0 байт - тогда переходим к следующему шагу, ну или как-то так).
Нужен универсальный вариант, без подбора таймаутов вручную, чтобы работало с любой длинной текста.
echo off | Out-Null
$p='E:\11\bin'
$s='E:\11'
echo ""
echo ""
echo ("=================================================Google Text-To=Speech=================================================")
echo ""
timeout /t 2 | Out-Null
echo ("1) Скачиваем файл...")
echo ""
start $p/hidec.exe download.bat
timeout /t 10 | Out-Null
echo ("2) Выделяем код...")
echo ""
findstr /I "audioContent" $p\source.txt > $p\out.txt
del $p\source.txt
timeout /t 2 | Out-Null
echo ("3) Обработываем полученный код...")
echo ""
start $p/hidec.exe text_mod.bat
timeout /t 5 | Out-Null
echo ("4) Конвертируем в mp3...")
echo ""
echo ""
& $p\b64.exe -d out1.txt $s\audio\sound.mp3
del $p\out1.txt
echo ("=========================================================Готово!==================================== ==================")
timeout /t 2 | Out-Null
explorer $s\audio
exit
Foreigner
18-12-2020, 04:37
google text-to-speech »
А он лучше, чем штатный голосовой движок? Например переводим текст в wav:
using namespace System.Speech
using namespace System.Speech.Synthesis
param (
[Parameter (Mandatory = $false, ValueFromPipeline = $true)]
[string]
$text = $(Get-Clipboard | Out-String),
<# Надо подключать дополнительные "голоса", через реестр, например Павла.
[Parameter(Mandatory = $false)]
[VoiceGender]
$sex = 'female',
#>
[Parameter(Mandatory = $false)]
[string]
$culture = 'ru-RU'
)
if ($PSEdition -eq 'Core')
{ Write-Warning 'Not Working on PowerShell 7'; return }
$speaker = [SpeechSynthesizer]::new()
if ($culture -eq 'en-US')
{
$speaker.SelectVoice('Microsoft Zira Desktop')
$speaker.Rate = -1
}
else
{
$speaker.SelectVoice('Microsoft Irina Desktop')
$speaker.Rate = 1
}
$speaker.SetOutputToWaveFile("$HOME\Desktop\out.wav")
$speaker.Speak($text)
Start-Sleep -Milliseconds 1500
$speaker.Dispose()
В этом случае мы не видим промежуточный текст. »
Если очень надо, то можно выводить в консоль буфер:
...{$a;write-host $a} else {...
А он лучше, чем штатный голосовой движок »
да, значительно.
Просто сам додумать не могу как избавится от таймаутов...
Если очень надо, то можно выводить в консоль буфер: »
[Произносится медленно, нараспев:] А поправить :)? В смысле — ежели надо не только вывести, но и оперативно поправить содержимое и зараз же продолжить?
В смысле — ежели надо не только вывести, но и оперативно поправить содержимое и зараз же продолжить? »
Это да, понятно, что консольный вывод не предназначен для редактирования...
Но меня опять терзают смутные сомнения :) , что первоначальная задача растет, как на дрожжах, в нечто большее, чем предполагалось изначально, при том, что она так и не сформулирована в законченном виде... то есть простор для фантазий у нас огромен, если не бесконечен. :)
Помогите офоормить правильно для PS:
$p='рабочая/папка'
:CHECK1
if (Test-Path -Path $p\source.txt=true) { #Test-Path возвращает true, если файл существует
write-host "Файл скачан!"
goto :RUN1
else goto :CHECK1
}
:RUN1
%Команда1%
%Команда2%
%Команда3%
проверяем наличие в папке файла source.txt, и переходим к выполнению команд, если файла там нет - повторяем поиск...и циклим поиск пока файл там не появится.
В идеале чтобы проверяло не только наличие файла, но и его размер, чтобы он был >0
Но меня опять терзают смутные сомнения , что первоначальная задача растет, как на дрожжах, »
Ага. Очередная «Каша из топора»™ :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC