Трюки PowerShell. Часть 3
Ну что ж, продолжим тему трюков PowerShell.
Заменяем текст в файле
Иногда возникают ситуации, когда надо заменить текст в некоторых файлах на какой-то другой текст. Это делается очень легко командлетами Get-Content и Set-Content.
Get-Content c:\somefile.txt | Foreach-Object { $_ -replace 'old', 'new' } | Set-Content c:\somefile.txt
Если вы попробуете так, то PowerShell будет жаловаться, что файл используется и не может быть записан.
PowerShell не умеют читать и писать в файл, в одно и то же время. Ваше решение должно бьть таким - использовать скобки, чтобы PowerShell сначало считывал файл а уже потом обрабатывал его содержание:
(Get-Content c:\somefile.txt) | Foreach-Object { $_ -replace 'old', 'new' } | Set-Content c:\somefile.txt
Сортировка нескольких свойств
Sort-Object может сортировать объекты по нескольким свойствам в одно и то же время. Вы можете посмотреть вот такой пример:
Get-Service | Sort-Object Status, Name
Этот кусок кода сначало построит список остановленных сервисов, потом в список будут выводится сервисы в запущенном состоянии. И два этих блока сервисов будут отсортированные по имени. Чтобы изменить порядок сортировки, вы можете добавить параметр –Descending. Затем, оба эти свойства будут отсортированы в порядке убывания. Вот как вы можете определить порядок сортировки по отдельности:
$prop1 = @{Expression='Status'; Descending=$true } $prop2 = @{Expression='Name'; Ascending=$true } Get-Service | Sort-Object $prop1, $prop2
Добавление дополнительной информации в объект
Иногда вы можете пометить результаты, возвращенные командлетом некоторой дополнительной информацией, например, ссылка на какое-то имя компьютера или метку времени. Это можно сделать использовнием командлета Add-Member для пометки какого-то свойства выводящегося в результат.
Следующие строчки скрипта возвращают все сервисы и дополнительно выведут два столбца – имя машины и время.
$result = Get-Service | Add-Member NoteProperty Computer $env:computername -pass | Add-Member NoteProperty Timestamp (Get-Date) -pass $result | Select-Object Status, Name, Computer, Time*
Обратите внимание, что при таком запросе вы увидите только новые столбцы, если Вы сделали соответствующий запрос Select-Object, чтобы их показать.
Создание удаленных решений
Всякий раз, когда вы используете WMI (Get-WMIObject), чтобы получить информацию, то несложно превратить локальное решение в удаленное. Вы можете просто добавить параметр -Computername, для командлета Get-WMIObject.
Вот функция, которая может запустить этот код как локально так и удаленно (при условии, что у вас достаточно привилегий доступа). Для примера она позволит узнать информацию о физической памяти:
function Get-Memory($computername = 'localhost')
{ $memorytype = "Unknown", "Other", "DRAM", "Synchronous DRAM", "Cache DRAM", "EDO", "EDRAM", "VRAM", "SRAM", "RAM", "ROM", "Flash", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR-2" $formfactor = "Unknown", "Other", "SIP", "DIP", "ZIP", "SOJ", "Proprietary", "SIMM", "DIMM", "TSOP", "PGA", "RIMM", "SODIMM", "SRIMM", "SMD", "SSMP", "QFP", "TQFP", "SOIC", "LCC", "PLCC", "BGA", "FPBGA", "LGA" $col1 = @{Name='Size (GB)'; Expression={ $_.Capacity/1GB } } $col2 = @{Name='Form Factor'; Expression={$formfactor[$_.FormFactor]} } $col3 = @{Name='Memory Type'; Expression={ $memorytype[$_.MemoryType] } } $col4 = @{Name='ComputerName'; Expression=[Scriptblock]::Create("'$computername'")} Get-WmiObject Win32_PhysicalMemory -computername $computername | Select-Object BankLabel, $col1, $col2, $col3, $col4 }