Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] запуск скрипта в powershell 7 и вывод информацию в консоли на русском

Ответить
Настройки темы
PowerShell - [решено] запуск скрипта в powershell 7 и вывод информацию в консоли на русском

Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день, народ!

У меня есть задача: на постоянное основе в файл JSON добавлять изменения. Сделал эту задачу через скрипт на поше через конвертацию. Однако, конвертация обратно из объекта в джейсон не корректно отрабатывает, то есть при преобразовании сдвигает все ключи/значенния вправо.
Решил данную задачу можно через Powershell версии 7. Но столкнулся с проблемой, что при запуске скрипта используется дефолтный пош на машине. Подскажите, пожалуйста, как мне добавить в скрипт информацию, чтобы он запускал мой скрипт через pwsh? Весь инет перерыл, нигде нет такой информации((
В скрипт добавил тихую установку поша 7й версии и по разному пробовал добавить запуск pwsh с дальнейшими действиями моего скрипта, но увы... всё без результатно он либо продолжает использовать 5.1 версию, либо просто останавливает скрипт на моменте запуска 7й версии

И ещё, дополнительно, тоже не могу понять: когда я конвертирую ps1 в exe у меня при запуске русские буквы просто не отображаются...
Тобишь есть вот обычный вывод в консоль:
Код: Выделить весь код
Write-Host -ForegroundColor Green -Object "Процесс обновления строки Json завершен"
Но в консоль выводится только ...json... то есть русских букв в принципе нет.
Пробовал и через такую команду:
Код: Выделить весь код
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866")
Однако, это не помогает, как я понял это работает только перед запуском скрипта в той же консоли, где ты запускаешь и в последующем запуске это снова нужно вводить.

Помогите, пожалуйста.

Спасибо!

Отправлено: 12:28, 17-10-2022

 

Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Так... вроде разобрался, только не понимаю на сколько это будет правильно и адекватно с точки зрения самого кода..)

В общем визуально получилось вот так:
Код: Выделить весь код
if (-not (Get-Command pwsh.exe*)) {
    return
    Install-PackageProvider -Name chocolatey -Force
    Set-PackageSource -Name Chocolatey -Trusted
    Install-PackageProvider -Name ChocolateyGet
    Install-Package -Name pwsh -Source Chocolatey -Provider ChocolateyGet -Force -Verbose
    }
    
else {
    if ($PSVersionTable.PSEdition -ne 'Core') {
        pwsh -file $MyInvocation.MyCommand.Source; 
        return
        Write-Host -Object "ERROR RUN PWSH.EXE"
       }
    else {
         'Пошёл мой код'
       }
}
Тип он проверяет на наличие установленного в система pwsh.exe, далее он переходит к else и выполняет свой внутренний if и ещё раз проверяет pwsh и запускает его, после идёт на else
не знаю, есть ли смысл делать 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 полноценно это всё отрабатывает и никаких ошибок не вызывает...

Последний раз редактировалось Njem, 18-10-2022 в 13:41.


Отправлено: 13:17, 18-10-2022 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Код: Выделить весь код
# Проверка на наличие pwsh.exe в $env:Path, если нет скрипт завершается

if (-not (Get-Command pwsh.exe*))
{
    return
}

# Проверка редакции PowerShell, в которой выполняется скрипт.
# Если скрипт выполняет powershell.exe, а не pwsh.exe, скрипт перезапускается в pwsh.exe
# Этот экземпляр завершается

if ($PSVersionTable.PSEdition -ne 'Core')
{
        pwsh -file $MyInvocation.MyCommand.Source
        return 
}

# Здесь весь остальной код
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:29, 18-10-2022 | #12


Старожил


Сообщения: 250
Благодарности: 51

Профиль | Отправить PM | Цитировать


... и все это ради индентации json на два пробела..

Отправлено: 03:46, 19-10-2022 | #13


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png NewJson.png
(12.0 Kb, 4 просмотров)
Тип файла: png OldJson.png
(10.9 Kb, 4 просмотров)

Цитата Serguei Kouzmine:
... и все это ради индентации json на два пробела.. »
Там не просто два пробела) там весь JSON улетает в целом)
Даже если просто два пробела ему указать, всё равно улетает всё также, как и улетало, только при 4х пробелов))

Специально для тебя, чтоб понимал приложил скриншот как выглядило до и после конвертации джейсона)

Отправлено: 12:56, 21-10-2022 | #14


Старожил


Сообщения: 250
Благодарности: 51

Профиль | Отправить PM | Цитировать


вот пример "pretty-print"

Код: Выделить весь код
$r = @'
{"a" : 1
,
    "b" : {
"c" :[
2,3,4]
}    
}
'@
статичесими фактори методами классов Newtonsoft.Json
Код: Выделить весь код
$y =  [Newtonsoft.Json.JsonConvert]::DeserializeObject($r)

$n = [Newtonsoft.Json.JsonConvert]::SerializeObject($y, [Newtonsoft.Json.Formatting]::Indented)

write-output $n

Код: Выделить весь код
{
  "a": 1,
  "b": {
    "c": [
      2,
      3,
      4
    ]
  }
}

как конфиурировать indent






то есть если надо чтобы выглядело как

Код: Выделить весь код
{
          "a": 1,
          "b": {
                    "c": [
                              2,
                              3,
                              4
                    ]
          }
}
написано в
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

Последний раз редактировалось Serguei Kouzmine, 22-10-2022 в 19:49. Причина: добавление примера

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:43, 22-10-2022 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] запуск скрипта в powershell 7 и вывод информацию в консоли на русском

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Вывод данных в cmd из PowerShell без запуска консоли Nolly Скриптовые языки администрирования Windows 3 03-05-2018 20:24
PowerShell - powershell запуск скрипта на удаленном компьютере с авторизацией на сетевом ресурсе densan Скриптовые языки администрирования Windows 4 15-02-2018 14:07
CMD/BAT - [решено] Вывод имен файлов на экран консоли Strinteijer Скриптовые языки администрирования Windows 5 04-07-2016 19:45
CMD/BAT - Скрипт сравнения дат. Непонятный вывод на консоли. FessAectan Скриптовые языки администрирования Windows 3 11-11-2013 12:47
PowerShell - [решено] Автоматический запуск скрипта PowerShell по времени. KAB Скриптовые языки администрирования Windows 7 06-03-2012 10:20




 
Переход