# Сразу используем массив, а не строку - можно обойтись без деления на части
$ComputerList = "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7", "PC8", "PC9", "PC10"
Write-Host -ForegroundColor Magenta "Количество компьютеров:" $ComputerList.Length
# Get-Random Умеет сам выбирать нужное количество элементов, поданных на вход
# к тому же он выдаёт гарантированно неповторяющиеся элементы, ваш вариант потенциально может выдать, например, два пятых компа
$NewList = $ComputerList | Get-Random -Count 5
Write-Host -ForegroundColor Green "Количество новых компьютеров:" $newList.Length
Write-Host -ForegroundColor Red "Список новых компьютеров:" $newList
Windows 7, установлен Net Framework 4.7
$psversiontable.psversion показывает что у меня 2ая версия powershell
# Тут можно импортировать модуль напрямую, если не класть его по вышеуказанным путям
#Import-Module C:\Path\To\Module\WindowHelper.psm1
# Или просто импортировать, если есть в путях (необязательно)
#Import-Module WindowHelper
# Импортируем типы для использования SendKeys
Add-Type -AssemblyName System.Windows.Forms
# Ищем среди всех окон окно с нужным заголовком
$w = Get-ChildWindows | ? { $_.Text -eq 'Visual Studio Code' }
# Клавиши, которые нужно нажимать
# Брать отсюда - https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.sendkeys
$KeySequence = '{F1}'
# Активируем нужное окно
Set-ForegroundWindow $w.Handle
# Небольшая задержка
Start-Sleep -Milliseconds 100
# Посылаем клавиши
[System.Windows.Forms.SendKeys]::SendWait($KeySequence)
function Get-ObjectValue($Object, $PropertyName) {
$property, $remain = $PropertyName -split '\.',2
if ($remain) {
Get-ObjectValue $Object.$property $remain
}
else {
$Object.$property
}
}
function Get-TextEncoding ($Encoding) {
switch -regex ($Encoding) {
'default' {
[System.Text.Encoding]::Default
}
'utf8' {
[System.Text.Encoding]::UTF8
}
'oem' {
[System.Text.Encoding]::GetEncoding(
(Get-Culture).TextInfo.OEMCodePage
)
}
'ansi' {
[System.Text.Encoding]::GetEncoding(
(Get-Culture).TextInfo.ANSICodePage
)
}
'^\d+$' {
[System.Text.Encoding]::GetEncoding([int]$Encoding)
}
default {
[System.Text.Encoding]::GetEncoding($Encoding)
}
}
}
function Convert-TextEncoding {
param (
[Parameter(ValueFromPipeline=$true,Position=0)]
[String[]]$InputObject,
[Parameter(Mandatory=$true,Position=1)]
[string]$FromEncoding,
[Parameter(Mandatory=$true,Position=2)]
[string]$ToEncoding
)
BEGIN {
try {
$FE = Get-TextEncoding $FromEncoding
$TE = Get-TextEncoding $ToEncoding
}
catch {
throw
}
}
PROCESS{
foreach ($s in $InputObject) {
if ($s) {
$TE.GetString($FE.GetBytes($s))
}
else {
$s
}
}
}
}
# Например, читабельный вывод из удалённо выполняемых консольных приложений я получаю так:
# Invoke-Command -ComputerName remoteComp { dism /online } | Convert-TextEncoding -FromEncoding 1251 -ToEncoding 866
$credential = Get-Credential domain\Admin
#Сначала другим пользователем, а потом им же, но с повышенными правами
Start-Process -Credential $credential -FilePath powershell -ArgumentList "Start-Process -Verb runAs -FilePath powershell -ArgumentList 'Get-Service winrm; read-host'"
function ShowMenu([array]$Menu, [int]$Default)
{
$minY = [Console]::CursorTop
$y = [Math]::Max([Math]::Min($Default, $Menu.Count), 0)
do {
[Console]::CursorTop = $minY
[Console]::CursorLeft = 0
$i = 0
foreach ($item in $Menu) {
$colors = @{
BackgroundColor = if ($i -ne $y) { [Console]::BackgroundColor } else { 'Cyan' }
ForegroundColor = if ($i -ne $y) { [Console]::ForegroundColor } else {' Blue' }
}
Write-Host (' {0}. {1} ' -f ($i+1), $item) @colors
$i++
}
$k = [Console]::ReadKey()
switch ($k.Key) {
'UpArrow' { if ($y -gt 0) { $y-- } }
'DownArrow' { if ($y -lt ($menu.Count - 1)) { $y++ } }
'Enter' { return $Menu[$y] }
}
} while ($k.Key -notin ([ConsoleKey]::Escape, [ConsoleKey]::Enter))
}
$Menu = 'test1','text2','menu3','result4'
ShowMenu $menu 2
Get-ADUser -filter "samAccountName -like '*env'" | Set-ADUser -ScriptPath "somescriptname"
Get-ADGroupMember somegroupname | Set-ADUser -ScriptPath "somescriptname"
$user = [ADSI]"LDAP://$($user_DistinguishedName)"
#read
#$user.psbase.InvokeGet('TerminalServicesInitialProgram')
#write
$user.psbase.InvokeSet('TerminalServicesInitialProgram', 'cmd.exe')
$user.SetInfo()
Get-Process $processname | Foreach-Object { $pslist=@{} } { $pslist[$_.id]=$_.cpu }
Get-Process $processname | Where-Object { ($_.cpu - $pslist[$_.id])/($numcores*$sleepseconds) * 100 -gt 75 }
$output = foreach ($item in $items)
{
#...
New-Object -TypeName PSObject -Property @{
#...
}
}
$output | Export-Csv -Encoding utf-8 -Path C:\organization.csv