### Функция разбора параметров командной строки
### На входе $arguments - массив параметров командной строки
### На выходе коллекция - "Команда","Аргумент команды"
### Формат параметров командной строки /Command='Parameter'
##############################################################
function parse_params($arguments) {
$out=@{}
foreach ($arg in $arguments) {
[string] $str_to_parse=$arg
$splited_str=$str_to_parse.Split('=')
if ($splited_str.Length -gt 2) {
Write-Host "В параметре команды присутствует знак '='! Значение параметра после этого знака будет отброшено!"
}
else {
#Если указан признак команды '/' - обрабатывать
if ($splited_str[0].Contains('/') -eq $TRUE) {
if ($splited_str.Length -eq 1) {
$out.add($splited_str[0],'') #Если команда указана без параметра
}
else {
$out.add($splited_str[0],$splited_str[1])
}
}
}
}
return $out
}
четверг, 31 июля 2008 г.
Передача параметров в скрипт PowerShell
Параметры командной строки сохраняются в массиве $args[]
Например при вызове: powershell.exe c:\myscript.ps1 -a:arg1 -b:arg2 -c:arg3
В массиве будет: args[0]="-a:arg1", args[1]="-b:arg2", args[2]="-c:arg3"
Сам массив можно разбирать с помощью, например foreach:
foreach ($arg in $args) {
Write-Host $arg
}
Замечание: При вызове, например с таким параметром: /path:"path to file"
Получится:
args[0]=/path:path
args[1]=to
args[2]=file
А при вызове /path:'path to file'
args[0]=/path:path to file
Например при вызове: powershell.exe c:\myscript.ps1 -a:arg1 -b:arg2 -c:arg3
В массиве будет: args[0]="-a:arg1", args[1]="-b:arg2", args[2]="-c:arg3"
Сам массив можно разбирать с помощью, например foreach:
foreach ($arg in $args) {
Write-Host $arg
}
Замечание: При вызове, например с таким параметром: /path:"path to file"
Получится:
args[0]=/path:path
args[1]=to
args[2]=file
А при вызове /path:'path to file'
args[0]=/path:path to file
Ярлыки:
powershell,
scripring
среда, 30 июля 2008 г.
Скрипт power shell, определюящий запущена ли служба ntpd на удаленных компьютерах
#### Функция определения максимальной длины имени компьютера
function get_max_length($computers){
$max_length=0
[string] $name=""
foreach ($computer in $computers) {
$name=$computer.Name
if ($name.length -gt $max_length) {
$max_length=$name.length
}
}
$max_length
}
############################################################
### Функция, формирующая строку из пробелов количеством $spc
function add_spaces($spc) {
$spaces=''
if ($spc -gt 0) {
for ($i=1; $i -le $spc; $i++) {
$spaces=$spaces+' '
}
}
$spaces
}
############################################################
Clear-Host #Очистка окна вывода
$out_exp="Write-Host " #Переменная, определяющая тип вывода результата работы скрипта
$local_pc=Get-WmiObject -Class Win32_ComputerSystem
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
##### Формирование заголовка таблицы #######################
$num_spaces=get_max_length($pc_list)
$num_spaces1=$num_spaces-13
$table_hdr=' "Computer Name'+(add_spaces($num_spaces1))+' IP Address NTPD Status"'
$res_hdr=$out_exp+$table_hdr
Invoke-Expression $res_hdr
############################################################
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
$ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$($pc.Name)'"
if ($ping.StatusCode -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис RCP
if ($local_pc.Name -eq $pc.Name) {
#Если локальный ПК, то -Credential использовать нельзя
$pc_role="Local PC"
#$exp - строковое значение команды Get-WmiOnject
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
else {
$pc_role=$pc.ComputerRole
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name -Credential $cred'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
#Вызов команды PS как значения строковой переменной.
$result=Invoke-Expression $exp
if ($result.State -eq "Running") {
#Собственно здесь уже можно работать с объектами wmi.
#Write-Host "RPC Service Running on $($pc.Name). Computer Role is $($pc_role)"
#Формируем строку для выыода в таблицу
$dop_spc=$num_spaces-$pc.Name.Length
$name_row=' "'+$pc.Name+(add_spaces($dop_spc))
#Определение, запущена ли служба ntpd
$ntpd=Invoke-Expression $exp_ntpd
if ($ntpd.State -eq "Running") {
#Write-Host "NTPD is Running"
$ntpd_row=' RUN'
}
else {
#Write-Host -ForegroundColor Red "NTPD is NOT Running!"
$ntpd_row=' NOT'
}
#Определение IP адреса удаленного компьютера
$net_adapters=Invoke-Expression $exp_ip
foreach ($net_adapter in $net_adapters) {
if ($net_adapter.IPEnabled -eq $TRUE) {
#Write-Host $net_adapter.IPAddress
$dop_spc=14-$net_adapter.IPAddress[0].Length
$ip_row=$net_adapter.IPAddress+(add_spaces($dop_spc))
#Здесь нужно сформировать результирующую строку для вывода в таблицу
$result_row=$out_exp+$name_row+' '+$ip_row+$ntpd_row+'"'
Invoke-Expression $result_row
}
}
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
function get_max_length($computers){
$max_length=0
[string] $name=""
foreach ($computer in $computers) {
$name=$computer.Name
if ($name.length -gt $max_length) {
$max_length=$name.length
}
}
$max_length
}
############################################################
### Функция, формирующая строку из пробелов количеством $spc
function add_spaces($spc) {
$spaces=''
if ($spc -gt 0) {
for ($i=1; $i -le $spc; $i++) {
$spaces=$spaces+' '
}
}
$spaces
}
############################################################
Clear-Host #Очистка окна вывода
$out_exp="Write-Host " #Переменная, определяющая тип вывода результата работы скрипта
$local_pc=Get-WmiObject -Class Win32_ComputerSystem
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
##### Формирование заголовка таблицы #######################
$num_spaces=get_max_length($pc_list)
$num_spaces1=$num_spaces-13
$table_hdr=' "Computer Name'+(add_spaces($num_spaces1))+' IP Address NTPD Status"'
$res_hdr=$out_exp+$table_hdr
Invoke-Expression $res_hdr
############################################################
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
$ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$($pc.Name)'"
if ($ping.StatusCode -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис RCP
if ($local_pc.Name -eq $pc.Name) {
#Если локальный ПК, то -Credential использовать нельзя
$pc_role="Local PC"
#$exp - строковое значение команды Get-WmiOnject
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
else {
$pc_role=$pc.ComputerRole
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name -Credential $cred'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
#Вызов команды PS как значения строковой переменной.
$result=Invoke-Expression $exp
if ($result.State -eq "Running") {
#Собственно здесь уже можно работать с объектами wmi.
#Write-Host "RPC Service Running on $($pc.Name). Computer Role is $($pc_role)"
#Формируем строку для выыода в таблицу
$dop_spc=$num_spaces-$pc.Name.Length
$name_row=' "'+$pc.Name+(add_spaces($dop_spc))
#Определение, запущена ли служба ntpd
$ntpd=Invoke-Expression $exp_ntpd
if ($ntpd.State -eq "Running") {
#Write-Host "NTPD is Running"
$ntpd_row=' RUN'
}
else {
#Write-Host -ForegroundColor Red "NTPD is NOT Running!"
$ntpd_row=' NOT'
}
#Определение IP адреса удаленного компьютера
$net_adapters=Invoke-Expression $exp_ip
foreach ($net_adapter in $net_adapters) {
if ($net_adapter.IPEnabled -eq $TRUE) {
#Write-Host $net_adapter.IPAddress
$dop_spc=14-$net_adapter.IPAddress[0].Length
$ip_row=$net_adapter.IPAddress+(add_spaces($dop_spc))
#Здесь нужно сформировать результирующую строку для вывода в таблицу
$result_row=$out_exp+$name_row+' '+$ip_row+$ntpd_row+'"'
Invoke-Expression $result_row
}
}
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
Ярлыки:
powershell,
scripring
понедельник, 28 июля 2008 г.
Инструментарий Windows Power Shell
Собственно, что такое Windows Power Shell можно прочитать здесь:
Здесь же я буду отмечать только то, что выполнялось мной в повседневной работе. Так сказать "Записки на полях".
Сразу порекомендую два дополнительных (бесплатных!) продукта от компании quest:
PowerGUI и Management Shell for Active Directory.
Собственно пока и все. Продолжение следует
----
Получение списка компьютеров в домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var.Remove($var.Length-1,1)
}
Прим. Get-QADComputer - функция из Management Shell for Active Directory
---
Получение IP адресов компьютеров домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var=$var.Remove($var.Length-1,1)
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True
foreach ($ip in $net) {
Write-Host $var, $ip.IPAddress
}
}
В данном случае не обрабатывается ситуация, когда запрашиваемый с помощью объекта WMI компьютер выключен, или не подключен к сети. В такой ситуации выдается сообщение об ошибке:
Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
В строке 5, позиция 21
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True
Для отключения сообщений об ошибках необходимо использовать параметр -ErrorAction SilentlyContinume для Get-WMIObject.
Вот пример подобного скрипта
Аналогично я переписал вот такой вот скрипт:
Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
ping.exe $pc.Name -n 1 | Out-Null
if ($LASTEXITCODE -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
Все, в принципе работает, но нервирует постоянное открытие окна командной строки! С помощью "гуглинга" нашел следующую статью.
И, пользуясь рекомендациями переписал скрипт:
Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
$ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$($pc.Name)'"
if ($ping.StatusCode -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
Использование строковой переменной, в качестве команды PowerShell
Для этих целей используется команда Invoke-Expression, например:
Clear-Host
$proc="explorer"
$exp='Get-Process $proc'
$result=Invoke-Expression $exp
Достает длинный тайм-аут при запросе удаленных ПК, на которых не активна RPC.
По этому поводу читаем тут :-(
Энн Грабб. Широкие возможности PowerShell
Да и с помощью гуглинга можно "нарыть" достаточно дополнительной инфы.Здесь же я буду отмечать только то, что выполнялось мной в повседневной работе. Так сказать "Записки на полях".
Сразу порекомендую два дополнительных (бесплатных!) продукта от компании quest:
PowerGUI и Management Shell for Active Directory.
Собственно пока и все. Продолжение следует
----
Получение списка компьютеров в домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var.Remove($var.Length-1,1)
}
Прим. Get-QADComputer - функция из Management Shell for Active Directory
---
Получение IP адресов компьютеров домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var=$var.Remove($var.Length-1,1)
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True
foreach ($ip in $net) {
Write-Host $var, $ip.IPAddress
}
}
В данном случае не обрабатывается ситуация, когда запрашиваемый с помощью объекта WMI компьютер выключен, или не подключен к сети. В такой ситуации выдается сообщение об ошибке:
Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
В строке 5, позиция 21
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True
Для отключения сообщений об ошибках необходимо использовать параметр -ErrorAction SilentlyContinume для Get-WMIObject.
Вот пример подобного скрипта
Аналогично я переписал вот такой вот скрипт:
Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
ping.exe $pc.Name -n 1 | Out-Null
if ($LASTEXITCODE -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
Все, в принципе работает, но нервирует постоянное открытие окна командной строки! С помощью "гуглинга" нашел следующую статью.
И, пользуясь рекомендациями переписал скрипт:
Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
$ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$($pc.Name)'"
if ($ping.StatusCode -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}
}
}
Использование строковой переменной, в качестве команды PowerShell
Для этих целей используется команда Invoke-Expression, например:
Clear-Host
$proc="explorer"
$exp='Get-Process $proc'
$result=Invoke-Expression $exp
Достает длинный тайм-аут при запросе удаленных ПК, на которых не активна RPC.
По этому поводу читаем тут :-(
Ярлыки:
powershell,
scripring
четверг, 24 июля 2008 г.
Давно не было музычки

Вот. Накопал чудесный саунд от "The Republic Tigers", альбом "Keep Color" (2008).
Душевно, хороший музычка.
Ярлыки:
музыка
Интересная книжица
Стансислав Гроф "Духовный кризис: Когда преобразование личности становится кризисом"
Аннотация:
Аннотация:
Сегодня все большее число людей, вовлеченных в процесс личностной трансформации, испытывает эпизоды духовного кризиса, когда процесс духовного роста и перемен становится хаотическим и захлестывающим. В этой антологии выдающиеся психологи, психиатры и духовные учителя задаются вопросом о природе духовного кризиса, о связи между духовностью, безумием и целостностью. В каких формах проявляется духовный кризис? Какие надежды и разочарования внутренне присущи духовной практике? Чем друзья, семья и профессионалы могут помочь людям, находящимся в духовном кризисе?
Лежит здесь
Лежит здесь
Ярлыки:
психология
среда, 16 июля 2008 г.
Навеяло
Даже если над твоей головой пасмурное небо, Солнце все равно для тебя светит. Смотри на него своим сердцем.
Не знаю, то ли сам придумал, то ли где-то из памяти вытащил.
Не знаю, то ли сам придумал, то ли где-то из памяти вытащил.
Замечательная музычка

Ярлыки:
музыка
Хорошо сказано
Однажды одного чемпиона мира по бильярду попросили объяснить причину его успеха и, почему никто не может у него выиграть. Тот ответил: «Все очень просто. Пока другие играют со мной, я в это время играю в бильярд».
Ярлыки:
изречения
пятница, 11 июля 2008 г.
Еще олдырей

"Object 47" - 11 по счету и самый свежий (2008) альбом от британских нью-вэйверов Wire.
И свежо, и дух New-Wave присутствует.
Рекомендую!
Ярлыки:
музыка
Подписаться на:
Сообщения (Atom)