Microsoft User Group Винница feedback Трюки PowerShell. Часть 3 - Александр Гончарук - технический блог - Microsoft User Group Винница

Планируемые события:

Запуск Internet Explorer 9 в Виннице - сентябрь

 

Трюки 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
}

Related Posts with Thumbnails Posted июн 19 2010, 11:27 by Alex Honcharuk View 295 2
Filed under:

Comments

vlad2135 on 07-16-2010 18:00

Вопрос на счет замены контента в файле - как быть с разными кодировками? Я замену тоже сам делал, но если файл был в cp1251, то читается он нормально, но при сохранении повершелл конвертит кодировку в UTF-8!

Alex Honcharuk on 07-17-2010 22:41

Попробуйте поигратся с .NET классом Encoding из PowerShell.

Add a Comment

(required)  
(optional)
(required)  
Remember Me?
Please add 5 and 6 and type the answer here:

Enter captcha:

© 2008-2010 "Microsoft User Group Винница". Использование материалов сайта разрешено только при условии указания источника. Коммерческое использование материалов сайта возможно лишь с письменного разрешения администрации ресурса. За достоверность информации ответственность несет автор публикации.

Информация

О нас
Timeline
Партнеры
Инфопартнерство
Реклама на сайте
Поддержать сайт

Разделы

Блоги
Медиа
Форумы
Вики
Презентации

Работа

Вакансии
Компании

Контакты

msugvn@gmail.com
krakovetsky.alex
@msugvnua
ВКонтакте
LinkedIn
Facebook
INETA

Разработка логотипа: Helen

RSS подписка - Microsoft User Group Винница  Twitter - Microsoft User Group Винница

Статистика

Powered by Community Server (Non-Commercial Edition), by Telligent Systems