Трюки PowerShell. Часть 3

суббота, 19 июня 2010, Alexander Honcharuk

Ну что ж, продолжим тему трюков 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
}


Ищите нас в интернетах!

Комментарии

Свежие вакансии