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

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

Ответить
Настройки темы
PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.

Пользователь


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

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


Здравствуйте.
В одном скрипте есть функция, которая должна делать определение пользователя работающего на удаленном ПК.
Нужно чтобы определялись пользователи залогиненные с консоли, через RDP, через инструмент Подключение к виртуальной машине (Hyper-V).
Все эти данные показывает утилита qwinsta, которая присутствует и в W10 и в W7. Но есть проблема: в сети присутствуют ПК как с En так и Ru локализацией.
При запуске на кириллических системах через ISE

Код: Выделить весь код
$Results = qwinsta /server:$env:COMPUTERNAME
или
Код: Выделить весь код
Start-Process -filepath 'qwinsta.exe' -argumentlist "/server:$env:COMPUTERNAME" -RedirectStandardOutput "C:\temp\StandardOutput.txt"
$Result = get-content "C:\temp\StandardOutput.txt"
в результате получаю крякозябры.

При запуске в консоли PS - все красиво, но уверен что часть сотрудников для кого пишется скрипт будут его запускать через ISE.

Подскажите есть какое-то решение по получению вывода от консольных приложений в читаемом варианте или корректная перекодировка на лету?

Как вариант можно через
Код: Выделить весь код
$result = Invoke-Command -computername ИМЯ ПК -ScriptBlock {
 здесь будут команды по получении данных из qwinsta, их парсингу и возврат 
}
Хочется сделать универсальное решение, чтобы в дальнейшем его использовать.

Отправлено: 10:35, 26-08-2019

 

Ветеран


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

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


densan, а зачем Вам вообще промежуточный текстовый файл:
Код: Выделить весь код
cmd /c "qwinsta /server:$env:COMPUTERNAME" |Out-File c:\temp\1.txt -Encoding default
$queryResults = Get-Content c:\temp\1.txt …
?! Можно же просто запуск-чтение стандартного потока вывода, например, пользовать. Наподобие:
Скрытый текст
Код: Выделить весь код
$oProcess = New-Object -TypeName 'System.Diagnostics.Process'

$oProcess.StartInfo.FileName               = 'qwinsta.exe'
$oProcess.StartInfo.Arguments              = "/server:$env:COMPUTERNAME"
$oProcess.StartInfo.CreateNoWindow         = $true
$oProcess.StartInfo.UseShellExecute        = $false
$oProcess.StartInfo.RedirectStandardOutput = $true

if($oProcess.Start()) {
    $oProcess.WaitForExit()
    Write-Host $($oProcess.StandardOutput.ReadToEnd()) -ForegroundColor Cyan

    if($oProcess.ExitCode -eq 0) {
        Write-Host "OK." -ForegroundColor Green
    } else {
        Write-Host "Error. ExitCode: $($oProcess.ExitCode)" -ForegroundColor Red
    }
}

Не?

Отправлено: 17:53, 26-08-2019 | #11



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

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


Пользователь


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

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


В сети безопасники включили для PS режим CLM, часть функционала PS заблокирована.
Код: Выделить весь код
New-Object : Не удается создать тип. В этом языковом режиме поддерживаются только основные типы.
Чтобы не проверять наличие каталога и права на запись скорректировал скрипт на
Код: Выделить весь код
                    $tmp = New-TemporaryFile
                    cmd /c "qwinsta /server:$env:COMPUTERNAME" |Out-File $tmp.FullName -Encoding default
                    $queryResults = Get-Content $tmp.FullName -Encoding oem |  foreach { (($_.trim() -replace "\s+",","))} | ConvertFrom-Csv
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:32, 27-08-2019 | #12


Ветеран


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

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


densan, в любом случае — зачем Вам вызов cmd /c? Мне кажется, что он тут лишний, не?

Отправлено: 16:06, 27-08-2019 | #13


Пользователь


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

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


Спасибо, действительно конструкция без cmd /c работает:
Код: Выделить весь код
$tmp = New-TemporaryFile
$(qwinsta /server:$env:COMPUTERNAME) |Out-File $tmp.FullName -Encoding default
$queryResults = Get-Content $tmp.FullName -Encoding oem |  foreach { (($_.trim() -replace "\s+",","))} | ConvertFrom-Csv
Сейчас уже не припомню, но был случай, после которого я стал использовать cmd /c, возможно это было на древних версиях PS.

Отправлено: 16:44, 27-08-2019 | #14



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [решено] Backup Switch conf(Вызов powershell ), не работает скрипт. shtir Скриптовые языки администрирования Windows 2 16-11-2015 08:45
CMD/BAT - [решено] Powershell вызов из cmd c4uran Скриптовые языки администрирования Windows 7 15-09-2015 10:53
CMD/BAT - Запись результата команды в txt DeepPurple Скриптовые языки администрирования Windows 4 12-12-2013 15:31
CMD/BAT - [решено] Вызов функции из скрипта powershell ferget Программирование и базы данных 0 03-06-2011 03:33
CMD/BAT - [решено] выполнение команды с повторением до результата cher Скриптовые языки администрирования Windows 3 23-05-2011 16:52




 
Переход