$start_path="c:\windows\"
function showdir {
param (
$path
)
$files=Get-ChildItem $path
foreach ($file in $files) {
if ($file.PSIsContainer) {
showdir -path $file.FullName
}
else {
if (($file.Extension -eq '.dll') -or ($file.Extension -eq '.exe')) {
$f=gwmi -Class CIM_DataFile -Filter "Name='$(add_slhs($file.FullName))'"
Write-Host $file.FullName,$f.Version
}
}
}
}
function add_slhs($src) {
$dst=""
for ($i=0;$i -lt $src.length;$i++) {
if ($src[$i] -ne "\") {
$dst=$dst+$src[$i]
}
else {
$dst=$dst+$src[$i]+"\"
}
}
return $dst
}
showdir -path $start_path
Показаны сообщения с ярлыком powershell. Показать все сообщения
Показаны сообщения с ярлыком powershell. Показать все сообщения
четверг, 18 сентября 2008 г.
пятница, 15 августа 2008 г.
Powershell Foreach-Object и Continue
Столкнулся с таким вот:
Если в блоке -Process {} командлета встречается инструкция Continue - выполнение скрипта прекращается. Описано здесь.
Если в блоке -Process {} командлета встречается инструкция Continue - выполнение скрипта прекращается. Описано здесь.
Ярлыки:
powershell,
scripring
вторник, 12 августа 2008 г.
среда, 6 августа 2008 г.
Powershell получение списка учетных записей локальных пользователей
Clear-Host #Очищаем окно вывода
$computer=$env:COMPUTERNAME #Получаем имя локального компьютера
Get-WmiObject -Class Win32_UserAccount -ComputerName $computer '
-Filter "LocalAccount='true'"
$computer=$env:COMPUTERNAME #Получаем имя локального компьютера
Get-WmiObject -Class Win32_UserAccount -ComputerName $computer '
-Filter "LocalAccount='true'"
Ярлыки:
powershell,
scripring
понедельник, 4 августа 2008 г.
Обработка исключительных ситуаций в PowerShell
Оригинал статьи здесь.
Материал wikipedia об исключительных ситуациях при выполнении программ здесь
Материал wikipedia об исключительных ситуациях при выполнении программ здесь
Поскольку PowerShell основана на концепции .Net, все возникающие и обрабатываемые исключения выполнения являются частью .Net. Если при выполнении метода .Net происходит ошибка, которая не может быть обработана внутри самого метода, то возникает исключительная ситуация, информация о которой передается в участок кода, откуда был вызван метод. В .Net для обработки исключительных ситуаций используется объект System.Exception.
Для обработки исключений в PowerShell используются инструкции Throw и Trap.
Инструкция Throw используется для "проталкивания" информации об исключении вызывающему методу. Причем в отличии от .Net, в PowerShell можно "проталкивать" не только исключения, но и результаты выполнения команд.
Например:
Throw (new-object IO.DirectoryNotFoundException) - создаст System.Exception "Попытка доступа к пути, отсутствующему на диске".
Throw (ls *.*) - Создаст исключительную ситуацию System.Exception со свойством Message, установленным в результат исполнения команды ls *.*
Для перехвата исключительной ситуации используется инструкция Trap. Переменная $ErrorActionPrefrences определяет, будут ли инструкции Trap обрабатываться.
Для обработки исключений в PowerShell используются инструкции Throw и Trap.
Инструкция Throw используется для "проталкивания" информации об исключении вызывающему методу. Причем в отличии от .Net, в PowerShell можно "проталкивать" не только исключения, но и результаты выполнения команд.
Например:
Throw (new-object IO.DirectoryNotFoundException) - создаст System.Exception "Попытка доступа к пути, отсутствующему на диске".
Throw (ls *.*) - Создаст исключительную ситуацию System.Exception со свойством Message, установленным в результат исполнения команды ls *.*
Для перехвата исключительной ситуации используется инструкция Trap. Переменная $ErrorActionPrefrences определяет, будут ли инструкции Trap обрабатываться.
Ярлыки:
powershell,
scripring
четверг, 31 июля 2008 г.
Написал функцию PowerShell для разбора аргументов командной строки
### Функция разбора параметров командной строки
### На входе $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
}
### На входе $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
}
Ярлыки:
powershell,
scripring
Передача параметров в скрипт 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
Подписаться на:
Сообщения (Atom)
