Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

   

Uriu

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Версии

PowerShell 1.0 -  На текущий момент совершенно неактуальная версия, интересная только для истории. /Прямые ссылки/
PowerShell 2.0 и WinRM 2.0 - Последняя версия, работающая на Windows XP и Windows 2003 (Ещё) /Прямые ссылки/
PowerShell 3.0 (Windows Management Framework 3.0)
PowerShell 4.0 (Windows Management Framework 4.0)
PowerShell 5.0 (Windows Management Framework 5.0)
PowerShell 5.1 (Windows Management Framework 5.1)
PowerShell Core 6.0 (не заменяет PowerShell 5.1)



Ассоциация

Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\system32\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\sysWOW64\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files (86)\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*



вопрос о подписи скриптов

Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)



Прочее


  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)




Расширение возможностей PowerShell
Функции
* Write-Color
* PowerTab --- Расширение функций клавиши Tab
Провайдеры
Готовые скрипты
* Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
 


Работа со сценариями в Windows PowerShell
Раздел в MSDN
Краткие справочники по Windows PowerShell 3.0 (english)
Windows PowerShell Франк Кох (БЕРН)  Разработчик и пропагандист платформы. На русском языке в формате pdf и doc

Всего записей: 340 | Зарегистр. 25-11-2004 | Отправлено: 07:13 23-03-2006 | Исправлено: KapralBel, 09:31 29-01-2018
Godzie

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, мысль уловил!

Всего записей: 263 | Зарегистр. 11-09-2015 | Отправлено: 14:07 02-12-2015
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Каким образом установить PowerShell 3,0 на Win XP ?

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 21:25 03-12-2015
bifido76



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Spy686
Походу PowerShell 3.0 только для Windows 7 и выше.

Всего записей: 769 | Зарегистр. 28-09-2015 | Отправлено: 19:32 04-12-2015
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Печаль.
 
Нужна команда Invoke-WebRequest.
 
Прийдется выкручиваться так:

Код:
$url = "http://www.astronomy.ru/forum/index.php"
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate($URL)  
while($ie.Busy) {start-sleep -m 50}  
$ie.Document.getElementsByTagName("td") | Where classname -eq lastpost
$ie.Quit()

 
---
 
Решение:
 
 

Код:
# function для конвертации из Json
function ConvertFrom-Json20([object] $item){  
    add-type -assembly system.web.extensions  
    $ps_js=new-object system.web.script.serialization.javascriptSerializer
    return $ps_js.DeserializeObject($item)  
}
 
 
# function получения $response_array из запроса
function response_array($objUrl){  
    $client = new-object System.Net.WebClient                # new-object
    $client.Encoding = [System.Text.Encoding]::UTF8            # Encoding
    $response_array = $client.DownloadString($objUrl)            # DownloadString
    return $response_array = ConvertFrom-Json20($response_array)    # Конвертируем полученные данные из формата JSON в массив  
}

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 12:19 05-12-2015 | Исправлено: Spy686, 15:36 06-12-2015
Spy686



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ктото подскажет где почитать про то как работать с post get запросами через powershell.
 
т.е. к примеру есть запрос:

Код:
 
GET http://m.vk.com/login HTTP/1.1
Host: m.vk.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: remixlang=0; remixstid=841603256_8179c3030b9fa4fa5d; remixflash=0.0.0; remixscreen_depth=24; remixdt=0; remixseenads=1; _ym_uid=1449386746460878061; _ym_isad=0; remixmdevice=1280/1024/1/!!-!!!!; remixlhk=8a82c3bd05825a1955
Connection: keep-alive
 
 

 
Как его с имитировать в PS со всеми  headers, и продолжить работать с данным объектом, т.е. затем отправить POST запрос, сохранить coocks и т.д.
 
Возможно есть примеры?

Всего записей: 193 | Зарегистр. 17-12-2010 | Отправлено: 15:35 06-12-2015 | Исправлено: Spy686, 15:36 06-12-2015
BW4ever

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как вернуть результат функции в виде массива?
Хочу получить список доменных групп текущего пользователя. Данный вариант работает, но возвращает результат как строку
function get-CUserADGroups{
$user=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$groups=$user.groups.Translate([System.Security.Principal.NTAccount])
$userdomain=$user.name.Split("\")[0]
$domaingroups=""
foreach ($group in $groups)
    {
        $group=$group.ToString()
        if ($group.StartsWith($userdomain) -eq $true)
        {
        $domaingroups += $group.Replace("$userdomain\",",")
        }
    }
return $domaingroups
}

Всего записей: 265 | Зарегистр. 18-05-2006 | Отправлено: 15:34 11-12-2015
KapralBel



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
function get-CUserADGroups{
$user=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$groups=$user.groups.Translate([System.Security.Principal.NTAccount])
return $groups
}


Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:42 11-12-2015
BW4ever

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну... я хотел локальные отфильтровать, и домен вырезать. А если брать $groups, то там будет все подряд.

Всего записей: 265 | Зарегистр. 18-05-2006 | Отправлено: 15:47 11-12-2015 | Исправлено: BW4ever, 15:48 11-12-2015
KapralBel



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Тогда объявите $domaingroups как массив
например $domaingroups=1..100 (массив из 100 элементов)
и в цикле foreach добавьте переменную индекса массива (например $index)
и
$domaingroups[$index] += $group.Replace("$userdomain\",",")  
$index++

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:54 11-12-2015
BW4ever

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А можно как-то в PoSH объявить пустой массив, чтобы потом в него добавлять значения?

Всего записей: 265 | Зарегистр. 18-05-2006 | Отправлено: 15:59 11-12-2015 | Исправлено: BW4ever, 16:05 11-12-2015
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А можно как-то в PoSH объявить пустой массив, чтобы потом в него добавлять значения?

[string[]]$domaingroups=$null

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 00:02 12-12-2015
Joo1z



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Давненько я не брал шашку в руки...
 
Столкнулся с непоняткой почему так
Get-ClusterNode | Get-ClusterResource | ?{$_.resourcetype.name -eq "Virtual Machine"}

Код:
 
Name                                              State                                             Group                                             ResourceType
----                                              -----                                             -----                                             ------------
Virtual Machine DC-01-UK-TRM-01                   Online                                            DC-01-UK-TRM-01                                   Virtual Machine
Virtual Machine DC-01-UK-TRM-02                   Online                                            DC-01-UK-TRM-02                                   Virtual Machine
Virtual Machine DC-01-UK-APP-01                   Online                                            DC-01-UK-APP-01                                   Virtual Machine
Virtual Machine DC-01-UK-SQL-01                   Online                                            DC-01-UK-SQL-01                                   Virtual Machine
Virtual Machine DC-01-UK-APP-03                   Online                                            DC-01-UK-APP-03                                   Virtual Machine
Virtual Machine DC-01-UK-SQL-02                   Online                                            DC-01-UK-SQL-02                                   Virtual Machine
Virtual Machine DC-01-UK-TRM-03                   Online                                            DC-01-UK-TRM-03                                   Virtual Machine
 

выдаёт список из 6 виртуалок, а вот так...
 

Код:
Get-ClusterNode | Get-ClusterResource | ?{$_.resourcetype.name -eq "Virtual Machine"} | foreach {Get-VM $_.OwnerGroup.Name}
 
Host                      VMElementName             State        Up-Time (mS) Owner
--------                  -------------             -----        ------------ -----
DC-01-UK-NOD-01           DC-01-UK-TRM-01           Running      835481603
DC-01-UK-NOD-01           DC-01-UK-TRM-02           Running      835473476
 

...получаем инфу только по двум?
 
---updated---
Кажется, разобрался. Без параметров, командлет Get-VM выполняется в контексте текущего сервера, соответственно нужен ключ -Server.

Всего записей: 123 | Зарегистр. 17-02-2009 | Отправлено: 15:31 12-02-2016 | Исправлено: Joo1z, 15:48 12-02-2016
Joo1z



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Башка не варит.
Есть запрос..., ну например
Get-WmiObject Win32_OperatingSystem | ft CSName, Caption, CSDVersion, Version, OSArchitecture
Как мне не создавая несколько запросов присвоить переменным соответствующие значения?
чтобы не было
$aaa=(Get-WmiObject Win32_OperatingSystem).CSName
$bbb=(Get-WmiObject Win32_OperatingSystem).Caption
$ccc=(Get-WmiObject Win32_OperatingSystem).Version
.... и т.д., а массиву переменных присвоился массив значений из вывода.
типа $aaa, $bbb, $ссс | foreach $_=(Get-WmiObject Win32_OperatingSystem).$Property

Всего записей: 123 | Зарегистр. 17-02-2009 | Отправлено: 18:46 15-03-2016
angeltwo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joo1z
а зачем массив и переменные? Присвойте вывод одной переменной и используйте весь объект, указывая в нужных местах нужные свойства

Код:
 
$o = Get-WmiObject Win32_OperatingSystem | Select CSName, Caption, CSDVersion, Version, OSArchitecture
 
$o.Caption
$o.CSDVersion
$o.CSName
$o.OSArchitecture
$o.Version
 

Всего записей: 257 | Зарегистр. 09-05-2007 | Отправлено: 13:58 05-04-2016
Kakazabr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, появилась задача написать скрипт...  
   
  ...кoтoрый в зaдaннoй пaпкe |"пaрaмeтр cкриптa"| и пoдпaпкaх ищeт фaйлы *.txt, и, ecли рaзмeр фaйлa бoльшe 200 Кб или дaтa пocлeднeгo измeнeния более 60 днeй, пeрeмeщaeт eгo в oтдeльную пaпку |"втoрoй пaрaмeтр cкриптa"|.  
  Cкрипт дoлжeн лoгирoвaть прoизвeдeнныe дeйcтвия в log.txt  
  Также при перемещении файлов необходимо обеспечить уникальность имен файлoв.  
   
  Помогите пожалуйста в решении задачки. Мое знакомство с PS состоялось не так давно, и знаний недостаточно...

Всего записей: 3 | Зарегистр. 26-04-2016 | Отправлено: 23:20 26-04-2016
zoric

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как получить доступ к дополнительным свойствам файла (те, что скрываются во вкладке "Подробно")?

Всего записей: 159 | Зарегистр. 29-07-2005 | Отправлено: 19:07 27-04-2016
Joo1z



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zoric
Встроенных возможностей похоже нет, но есть варианты готовых скриптов. https://gallery.technet.microsoft.com/scriptcenter/get-file-meta-data-function-f9e8d804
https://rkeithhill.wordpress.com/2005/12/10/msh-get-extended-properties-of-a-file/
 
Добавлено:
Kakazabr
Честно говоря лень скрипт писать.
Get-Help Get-Item -Examples и Get-Help Get-ChildItem -Examples тебе в помощь.
На 13й странице темы мне объясняли как параметры для скрипта прописывать.
 
Ах да! Часто, чтобы знать какими свойствами обладает объект (или какие методы к нему применимы) приходилось пользоваться Get-Member, например: Get-Item file.txt | Get-Member

Всего записей: 123 | Зарегистр. 17-02-2009 | Отправлено: 16:35 28-04-2016 | Исправлено: Joo1z, 16:45 28-04-2016
dirigar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BW4ever
Наверно уже не актуально, но все же.

Код:
 
function get-CUserADGroups{  
   $user=[System.Security.Principal.WindowsIdentity]::GetCurrent()  
   $groups=$user.groups.Translate([System.Security.Principal.NTAccount])  
   $userdomain=$user.name.Split("\")[0]  
   $domaingroups=""
   $groups | % {
     $_.value -match "^\s*$userdomain\\(.+)" | Out-Null;
     $Matches[1];
     $Matches.Clear()
   }
}
 

 
Добавлено:
Kakazabr

Цитата:
 ...кoтoрый в зaдaннoй пaпкe |"пaрaмeтр cкриптa"| и пoдпaпкaх ищeт фaйлы *.txt, и, ecли рaзмeр фaйлa бoльшe 200 Кб или дaтa пocлeднeгo измeнeния более 60 днeй, пeрeмeщaeт eгo в oтдeльную пaпку |"втoрoй пaрaмeтр cкриптa"|.    
  Cкрипт дoлжeн лoгирoвaть прoизвeдeнныe дeйcтвия в log.txt  
  Также при перемещении файлов необходимо обеспечить уникальность имен файлoв.  

 
Уникальность обеспечивается за суффикса из текущего времени.

Код:
 
function moveTXT {
    [CmdletBinding( SupportsShouldProcess = $true )]
    param
    (
        [parameter(ValueFromPipeline=$True,Mandatory=$true)]
        [string] $Path
        ,$Destination = "E:\BACKUP\txt"
        ,$LogFile = ".\log1.log"
        ,$Size = 200kb
        ,$Age = 60
    )
    md $Destination -Force | Out-Null;
    ls $path *.txt -Force -Recurse `
    | ?  { -not $_.psIsContainer } `
    | ? { ($_.length -gt $size) -or ($_.lastwritetime -gt (get-date).AddDays(-$age)) } `
    | % {  
        $DestPath = "$Destination\$($_.BaseName)_"+ `
        (get-date -Format "yyMMddHHmmss") + $_.Extension;
        $_ | Move-Item -Destination $DestPath;
        Add-Content $LogFile -Value "$( get-date):`tMove ""$($_.fullname)"" to ""$DestPath"""
    }
}
 

Всего записей: 7 | Зарегистр. 13-12-2013 | Отправлено: 14:49 06-05-2016 | Исправлено: dirigar, 16:05 06-05-2016
storysoft

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это баги или фишка?
1. Почему такой код выдает ошибку, получается trap не работает в функциях pipline?

Код:
 
function Out-FileLog {
    trap {
      write-host $_
      break
    }
    begin {#код}
    process {#код}
}
 
begin : Имя "begin" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность  
пути, после чего повторите попытку.
строка:6 знак:5
+     begin {
+     ~~~~~
    + CategoryInfo          : ObjectNotFound: (begin:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : CommandNotFoundException
 

 
2.Еще интересней - такой код не работает хотя по описанию командлета должно работать
 

Код:
 
split-path -literalpath "C:\Test\Logs\test.log" -parent
 
Split-Path : Не удается разрешить набор параметров с использованием указанных именованных параметров.
строка:1 знак:1
+ split-path -literalpath "C:\Test\Logs\test.log" -parent
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: ( [Split-Path], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.SplitPathCommand
 

 
С параметром -Path работает.
 
У кого-нибудь есть идеи?

Всего записей: 3 | Зарегистр. 08-01-2008 | Отправлено: 19:15 06-05-2016
dirigar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
storysoft

1. trap не там находится, т.е. не в скриптовом блоке.  
правильно так вроде
trap{}
function a {begin{trap{}} process{trap{}} end{trap{}}}
2. Split-Path -LiteralPath ".\Нужен\для\не\существующего\пути.нет"
у него может не быть родительской папки.  
У командлетов Powershell может быть несколько наборов параметров, каждый при этом набор имеет свое имя, если использовать параметры из разных наборов то будет ошибка, что и имеет место.
ссылка на статью https://smearg.wordpress.com/2015/06/05/%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%BD%D1%83%D0%B6%D0%BD%D1%8B-%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D1%8B-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D0%B2-powershell/
пример:

Код:
function a {
[CmdletBinding(DefaultParameterSetName='n1')]
param (
[parameter(ParameterSetName="n1")]$par1,
[parameter(ParameterSetName="n2")]$par2
)
begin {}
process { }
end {  
trap {Write-Host -fore Cyan "trap2"; throw "skdjf";}
Write-Host "`nfucntion a" }
}
 

Всего записей: 7 | Зарегистр. 13-12-2013 | Отправлено: 01:50 10-05-2016
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell
KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru