![]() |
запуск скрипта в powershell 7 и вывод информацию в консоли на русском
Добрый день, народ!
У меня есть задача: на постоянное основе в файл JSON добавлять изменения. Сделал эту задачу через скрипт на поше через конвертацию. Однако, конвертация обратно из объекта в джейсон не корректно отрабатывает, то есть при преобразовании сдвигает все ключи/значенния вправо. Решил данную задачу можно через Powershell версии 7. Но столкнулся с проблемой, что при запуске скрипта используется дефолтный пош на машине. Подскажите, пожалуйста, как мне добавить в скрипт информацию, чтобы он запускал мой скрипт через pwsh? Весь инет перерыл, нигде нет такой информации(( В скрипт добавил тихую установку поша 7й версии и по разному пробовал добавить запуск pwsh с дальнейшими действиями моего скрипта, но увы... всё без результатно он либо продолжает использовать 5.1 версию, либо просто останавливает скрипт на моменте запуска 7й версии :( И ещё, дополнительно, тоже не могу понять: когда я конвертирую ps1 в exe у меня при запуске русские буквы просто не отображаются... Тобишь есть вот обычный вывод в консоль: Код:
Write-Host -ForegroundColor Green -Object "Процесс обновления строки Json завершен" Пробовал и через такую команду: Код:
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866") Помогите, пожалуйста. Спасибо! |
Цитата:
Код:
if ($PSVersionTable.PSEdition -ne 'Core') { pwsh -file $MyInvocation.MyCommand.Source; return } |
Код:
pwsh -file "c:\путь\к\скрипту\скрипт.ps1" |
Цитата:
возможно, это вариант, но не думаю что хороший способ просто эти два файла потом перекидывать, если потребуется и так далее, думаю всё запихнуть в один и чтоб один файл запускать уже где угодно и опять же, файлы то будут не на одной машине, а могут перемещаться, тобишь каждый раз новый путь прописывать тоже не камельфо Цитата:
я так понял что-то должно быть внутри в коде, чтобы он понимал русский язык.. |
Цитата:
круто! идёт запуск с pwsh, пасибо!) осталось только понять как сделать отображаение русских букв, когда выводит консоль |
Цитата:
Можете при установке PS7 указать, чтобы он встраивался в контекстное меню. Можно запускать из ярлыка. Вариантов масса. |
Цитата:
я ж имел ввиду что вот в коде: Код:
pwsh -file "c:\путь\к\скрипту\скрипт.ps1" А нет случаем идеи, как бы заграть в скрипт функцию проверки pwsh в системе? Тип если pwsh есть, то юзать...{код} если нет то он устанавливает pwsh и идёт по новой к первому пункту Я установку pwsh сделал через команды: Код:
Install-PackageProvider -Name chocolatey -Force Код:
Set-PackageSource -Name Chocolatey -Trusted Код:
Install-PackageProvider -Name ChocolateyGet Код:
Install-Package -Name pwsh -Source Chocolatey -Provider ChocolateyGet -Force -Verbose Просто проверка через Код:
Find-Package -Name pwsh -Force Но вот если руками попробовать тот же код юзануть, то он найдёт спокойно установленный pwsh у меня |
Цитата:
Код:
if (Get-Command pwsh) { 'что-то делаем' } else { return } Код:
if (-not (Get-Command pwsh)) { return } |
Чтобы не убивать ошибки и варианты других программ лучше заменить "pwsh" на "pwsh.exe*":
Код:
if (-not (Get-Command pwsh.exe*)) { return } |
Цитата:
Получается, идёт проверка на наличие pwsh.exe: Код:
if (-not (Get-Command pwsh.exe*)) { Код:
Install-PackageProvider -Name chocolatey -Force Тобишь и получается как-то так в самом начале: Код:
if (-not (Get-Command pwsh.exe*)) { Просто по факту оно каждый раз запускает инсталятор pwsh, хотя когда он есть, надо скрип... |
Так... вроде разобрался, только не понимаю на сколько это будет правильно и адекватно с точки зрения самого кода..)
В общем визуально получилось вот так: Код:
if (-not (Get-Command pwsh.exe*)) { не знаю, есть ли смысл делать elseif как дополнительный параметр, если вдруг у него не получилось запустить pwsh? да и вообще нужна ли вторая проверка и запуск самого поша 7 ещё раз, тоже не знаю... работать то (вроде) работает, а вот сильно ли это костыльно и херово (мол пока что работает и ладно) вот это не знааю.. хотелось бы, конечно, сделать грамотно и чотко) p.s. хотя я смотрю косяк возникает когда я из этого .ps1 формируют .exe... первое что он выдаёт это ошибку: The command cannot be run because the File parameter requires a fine path. Supply a path for the File parameter and then try the command again. Это 101% не в моё коде, ибо если мой код также преобразовать в .exe то там всё отрабатывает как нужно и красиво, а вот если добавляешь эту часть с установкой.. проверкой pwsh то такая фигня(( Методом проб и ошибок, ругается он на вот эту команду: pwsh.exe -file $MyInvocation.MyCommand.Source и ничего дальше не запускает.. точно также (если выделить именно этот объект и запустить его) тогда не понимаю, почему он в .ps1 полноценно это всё отрабатывает и никаких ошибок не вызывает... |
Код:
# Проверка на наличие pwsh.exe в $env:Path, если нет скрипт завершается |
... и все это ради индентации json на два пробела..
|
Вложений: 2
Цитата:
Даже если просто два пробела ему указать, всё равно улетает всё также, как и улетало, только при 4х пробелов)) Специально для тебя, чтоб понимал приложил скриншот как выглядило до и после конвертации джейсона) |
вот пример "pretty-print"
Код:
$r = @' Код:
$y = [Newtonsoft.Json.JsonConvert]::DeserializeObject($r) Код:
{ как конфиурировать indent то есть если надо чтобы выглядело как Код:
{ https://www.newtonsoft.com/json/help...zeObject_3.htm https://www.newtonsoft.com/json/help...formatting.htm https://www.newtonsoft.com/json/help...ndentation.htm |
Время: 23:51. |
Время: 23:51.
© OSzone.net 2001-