Feeds:
Записи
Комментарии

Archive for Август 2011

Иногда хочется  использовать иконки из dll или exe. Это сделать довольно просто,для этого потребуется функция ExtractIconEx. Объявление этой функции можно посмотреть на сайте pInvoke .

$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System
{
	public class IconExtractor
	{

	    public static Icon Extract(string file, int number, bool largeIcon)
	    {
	        IntPtr large;
	        IntPtr small;
	        ExtractIconEx(file, number, out large, out small, 1);
	        try
	        {
	            return Icon.FromHandle(largeIcon ? large : small);
	        }
	        catch
	        {
	            return null;
	        }

	    }
	    [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
	    private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

	}
}
"@

Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing

Самый простой способ получения индекса иконки из файла — это в свойствах ярлыка нажать на «Change Icon».

Теперь приведу пример использования для нашей формы.

$form = New-Object System.Windows.Forms.Form
$form.Icon = [System.IconExtractor]::Extract("notepad.exe", 0, $true)
$form.ShowDialog()

$form = New-Object System.Windows.Forms.Form
$form.Icon = [System.IconExtractor]::Extract("shell32.dll", 15, $true)
$form.ShowDialog()

Если индекс указан неверно,то будет использована стандартная иконка.

Реклама

Read Full Post »

Многим, думаю, знакома утилита — tree,которая отображает графическую структуру папок. По умолчанию в PowerShell нет, командлета  с таким функционалом. Но его можно найти в прекрасном модуле для PowerShell — PSCX (http://pscx.codeplex.com/) реализованном  в виде функции.

После установки и импорта данного модуля,вы можете посмотреть весь набор команд,который предлагает данный модуль:


PS > Get-Command -Module PSCX

Нам же интересна функция — Show-Tree,исходный код функции можно посмотреть с помощью:


PS > ${function:Show-Tree}

Пример работы:

PS >  Show-Tree C:\windows
	C:\windows
	|--1C4551A64743409391E41477CD655043.TMP
	|  \--WiseCustomCalla.dll
	|--45235788142C44BE8A4DDDE9A84492E5.TMP
	|  \--WiseCustomCalla.dll
	|--8AAB4176A747493AA42CB63CFADFD8E3.TMP
	|  \--WiseCustomCalla.dll
	|--ADAM
	|  |--en
	|  |  \--ADSchemaAnalyzer.resources.dll
	|  |--en-US
	|  |  |--adaminstall.exe.mui
	|  |  |--adammsg.dll.mui
	|  |  |--adamsync.exe.mui
	|  |  |--adamuninstall.exe.mui
	|  |  \--adamwizard.dll.mui
	|  |--ru
	|  |  \--ADSchemaAnalyzer.resources.dll
	|  |--ru-RU
	|  |  |--adaminstall.exe.mui
	|  |  |--adammsg.dll.mui
	|  |  |--adamsync.exe.mui
	|  |  |--adamuninstall.exe.mui
	|  |  \--adamwizard.dll.mui
	|  |--adaminstall.exe

Более подробно об Show-Tree,вы можете прочитать в справки(набрав get-help Show-Tree -full).

Мне же потребовалось получить подобный вывод,но только для процессов.Перед собой я не ставил задачи:
получения информации с удаленного компьютера, ограничение глубины отображения и т.д.Но вы легко можете
добавить подобный функционал.


Function Show-ProcessTree
{
	Function Get-ProcessChildren($P,$Depth=1)
	{
		$procs | Where-Object {$_.ParentProcessId -eq $p.ProcessID -and $_.ParentProcessId -ne 0} | ForEach-Object {
			"{0}|--{1}" -f (" "*3*$Depth),$_.Name
			Get-ProcessChildren $_ (++$Depth)
			$Depth--
		}
	}

	#Фильтр для Where-Object
	$filter = {-not (Get-Process -Id $_.ParentProcessId -ErrorAction SilentlyContinue) -or $_.ParentProcessId -eq 0}
	#Получаем список процессов
	$procs = Get-WmiObject Win32_Process
	#Получаем список родительских процессов
	$top = $procs | Where-Object $filter | Sort-Object ProcessID
	foreach ($p in $top)
	{
		#Выводим имя родительского процесса
		$p.Name
		#Вызываем рекурсивную функцию,для получения дочерних процессов
		Get-ProcessChildren $p
	}
}

Пример вывода:

PS  >  Show-ProcessTree
System Idle Process
System
   |--smss.exe
csrss.exe
   |--conhost.exe
   |--conhost.exe
wininit.exe
   |--services.exe
      |--svchost.exe
         |--WmiPrvSE.exe
      |--svchost.exe
      |--svchost.exe
      |--svchost.exe
         |--dwm.exe
      |--svchost.exe
      |--svchost.exe
      |--svchost.exe
      |--svchost.exe
      |--spoolsv.exe
      |--sched.exe
....................... - Вывод обрезан

 

Read Full Post »

Get-WmiObject и TimeOut

К сожалению, на данный момент, Get-WmiObject не поддерживает параметр TimeOut и приходится долго ждать ответа(до 60 секунд).Что бывает не всегда удобно.Но в версии V2 появились Job,что легко решает эту проблему.

Решение с использование .Net ,можно посмотреть в блоге — http://bit.ly/py3TD0 . Удачно функция отработала в системе с Windows 7 и 2008 R2, в системах ниже,добиться результата не получилось,хотя с Job проблем не было.

Приведу короткий пример:

$servers = "server1","server2"

$servers | foreach {
	$job = Get-WmiObject Win32_OperatingSystem -ComputerName $_ -AsJob
	Wait-Job -Timeout 10 -Job $job | Receive-Job -Keep
	Remove-Job $job -Force
	} | Select-Object __Server,Caption

Read Full Post »

Какие существуют — Type-Accelerators , на данный момент в версии V3:


Name Type

---- ----

int System.Int32

bigint System.Numerics.BigInteger

long System.Int64

string System.String

char System.Char

bool System.Boolean

byte System.Byte

double System.Double

decimal System.Decimal

float System.Single

single System.Single

regex System.Text.RegularExpressions.Regex

array System.Array

xml System.Xml.XmlDocument

scriptblock System.Management.Automation.ScriptBlock

switch System.Management.Automation.SwitchParameter

hashtable System.Collections.Hashtable

type System.Type

ref System.Management.Automation.PSReference

psobject System.Management.Automation.PSObject

pscustomobject System.Management.Automation.PSObject

psmoduleinfo System.Management.Automation.PSModuleInfo

powershell System.Management.Automation.PowerShell

runspacefactory System.Management.Automation.Runspaces.RunspaceFactory

runspace System.Management.Automation.Runspaces.Runspace

ipaddress System.Net.IPAddress

wmi System.Management.ManagementObject

wmisearcher System.Management.ManagementObjectSearcher

wmiclass System.Management.ManagementClass

adsi System.DirectoryServices.DirectoryEntry

adsisearcher System.DirectoryServices.DirectorySearcher

psprimitivedictionary System.Management.Automation.PSPrimitiveDictionary

Alias System.Management.Automation.AliasAttribute

AllowEmptyCollection System.Management.Automation.AllowEmptyCollectionAttribute

AllowEmptyString System.Management.Automation.AllowEmptyStringAttribute

AllowNull System.Management.Automation.AllowNullAttribute

CmdletBinding System.Management.Automation.CmdletBindingAttribute

Parameter System.Management.Automation.ParameterAttribute

OutputType System.Management.Automation.OutputTypeAttribute

ValidateCount System.Management.Automation.ValidateCountAttribute

ValidateLength System.Management.Automation.ValidateLengthAttribute

ValidateNotNull System.Management.Automation.ValidateNotNullAttribute

ValidateNotNullOrEmpty System.Management.Automation.ValidateNotNullOrEmptyAttribute

ValidatePattern System.Management.Automation.ValidatePatternAttribute

ValidateRange System.Management.Automation.ValidateRangeAttribute

ValidateScript System.Management.Automation.ValidateScriptAttribute

ValidateSet System.Management.Automation.ValidateSetAttribute

PSTypeNameAttribute System.Management.Automation.PSTypeNameAttribute

Как получить список Type-Accelerators у себя в системе:

1) Использовать Reflector и класс — System.Management.Automation.TypeAccelerators

2) PowerShell

В своем блоге MVP по PowerShell — Oisin Grehan (http://www.nivot.org/post/2008/12/25/ListOfTypeAcceleratorsForPowerShellCTP3.aspx), описал оба метода. Приведу решение из его блога:


([type]::gettype("System.Management.Automation.TypeAccelerators"))::Get.getenumerator() | `

select @{Name="Name"; expression={$_.key}},

@{name="Type"; expression={$_.value}}

Помимо получения списка Type-Accelerators, он описал, как с помощью методов Add и Remove,можно создавать и удалять Accelerators. Благодаря, Oisin’у, другой MVP по PowerShell — Joel Bennett , создал небольшой модуль для работы с Type-Accelerators (poshcode.org/?show=762).

Еще один вариант, по созданию Type-Accelerators предложил один из гуру и MVP по PowerShell — Marc van Orsouw, его решение использование C# кода (http://bit.ly/qkYC2n).

Изменения в командлетах:

Во второй части я привел немного пример по работе с новыми параметрами Foreach-Object.В этой части немного дополню этот список. В замечательной книге — “Windows PowerShell Cookbook, 2nd Edition “ , за авторством Lee Holmes, одного из разработчиков PowerShell. Можно встретить в его примерах скриптов подобный синтаксис.

Посмотрим на параметр “MemberName”:


-MemberName <string>

Required? true

Position? 0

Accept pipeline input? false

Parameter set name PropertyAndMethodSet

Aliases None

Dynamic? false

А теперь на блок param из скрипта Invoke-Member.ps1 (http://poshcode.org/2183):


param(

## A switch parameter to identify the requested member as a method.

## Only required for methods that take no arguments.

[Parameter(ParameterSetName = "Method")]

[Alias("M","Me")]

[switch] $Method,

## The name of the member to retrieve

[Parameter(ParameterSetName = "Method", Position = 0)]

[Parameter(ParameterSetName = "Member", Position = 0)]

[string] $Member,

## Arguments for the method, if any

[Parameter(

ParameterSetName = "Method", Position = 1,

Mandatory = $false, ValueFromRemainingArguments = $true)]

[object[]] $ArgumentList = @(),

## The object from which to retrieve the member

[Parameter(ValueFromPipeline = $true)]

$InputObject

)

Сходство один в один, с новыми возможностями командлета Foreach-Object.


Invoke-Member

PS >"Hello","World" | .\Invoke-Member Length

5

5

V3

PS >"Hello","World" | foreach Length

Invoke-Member

PS >"Hello","World" | .\Invoke-Member -m ToUpper

HELLO

WORLD

V3

PS >"Hello","World" | foreach ToUpper

Invoke-Member

PS >"Hello","World" | .\Invoke-Member Replace l w

Hewwo

Worwd

V3

PS >"Hello","World" | foreach Replace l w

Разберем чуть подробнее, как работает последняя команда(“Hello»,»World» | foreach Replace l w”). В качестве аргументов выступают два объекта типа String, которые через конвейер передаются параметру InputObject(аргумент ValueFromPipeLine определяет, что параметр принимает входные данные из объекта конвейера).Параметр MemberName принимает аргумент Replace,который является методом у объекта типа String.Метод Replace принимает два аргумента l – старый символ,w – на что заменяем. Для передачи аргументов методу Replace, т.к аргументы l и w не привязаны не к одному параметру, они будут являться аргументами для параметра ArgumentList (Аргумент ValueFromRemainingArguments определяет, что параметр принимает все оставшиеся аргументы, которые не привязаны к параметрам).

3) Командлет Where-Object

Конечно добавилось много параметров и в основном они вам всем хорошо знакомы – это операторы сравнение (подробнее можно узнать в справки about_Comparison_Operators). Поэтому перечислять все их я не буду ,а лишь приведу синтаксис командлета.


SYNTAX

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] [-EQ] [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-FilterScript] <scriptblock> [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -Match [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -NE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CNE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -GT [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CGT [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -LT [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CLT [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -GE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CGE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -LE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CLE [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -Like [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CLike [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CNotLike [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -NotLike [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CMatch [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -NotMatch [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CNotMatch [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -Contains [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CContains [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -NotContains [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CNotContains [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -In [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CIn [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -NotIn [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CNotIn [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -Is [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -IsNot [<CommonParameters>]

Where-Object [-InputObject <psobject>] [-Property] <string> [[-Value] <Object>] -CEQ [<CommonParameters>]

Теперь опять посмотрим в Cookbook и найдем скрипт под названием Compare-Property.ps1 (http://poshcode.org/2132).

Приведу полностью сюда скрипт, дабы он не большой.


param(

## The property to compare

$Property,

## The operator to use in the comparison

$Operator = "eq",

## The value to compare with

$MatchText = "$true"

)

Begin { $expression = "`$_.$property -$operator `"$matchText`"" }

Process { if(Invoke-Expression $expression) { $_ } }

Теперь приведу примеры c Where-Object:


#Получить список файлов,который больше 100 байт

Get-ChildItem C:\Windows -File | Where Length -gt 100

#Получить список файлов,имена которых начинаются с прописной w

Get-ChildItem C:\Windows -File | Where Name -match ^w

#Получить список файлов,имена которых начинаются с заглавной W

Get-ChildItem C:\Windows -File | Where Name -сmatch ^W

#Получить список процессов у которых есть свойство Description

Get-Process | Where Description

#Проверить,что тип свойсва Length Int32

Get-Process | Where Length -is int

#Найти файлы в папке,которые больше 1мб и вывести их имена

Get-ChildItem C:\Windows -File | Where Length -gt 1mb | foreach Name

Read Full Post »

Продолжим рассматривать, что добавилось нового в версии PowerShell V3.Начнем с новых функций. На данный момент новых функций одна с именем  “ost”.  Ничего особого, она собой не представляет, и является лишь Proxy Function(командлет Out-String).

[CmdletBinding()]
param(
    [ValidateRange(2, 2147483647)]
    [int]
    ${Width},

    [Parameter(ValueFromPipeline=$true)]
    [psobject]
    ${InputObject})
begin {

    try {
        $PSBoundParameters['Stream'] = $true
        $wrappedCmd =
$ExecutionContext.InvokeCommand.GetCommand('Out-String',[System.Management.Automation.CommandTypes]::Cmdlet)
        $scriptCmd = {& $wrappedCmd @PSBoundParameters }
        $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
        $steppablePipeline.Begin($PSCmdlet)
    } catch {
        throw
    }

}

Функция принимает два параметра, оба не являются обязательными. Сами параметры описывать не буду, можно посмотреть в справки версии V2, т.к новыми они не являются. В начале блока begin мы видим, что передается параметр Stream со значением $true($PSBoundParameters – содержит словарь активных параметров и их текущих значений, которые будут переданы командлету Out-String,в данном примере от 1 до 3).Далее получаем информацию о командлете Out-String(подобный вывод вы видели при выполнении Get-Command Out-String). $scriptCmd – это scriptblock,который собственно и будет выполняться  с переданными параметрами. Дальше происходит инициализация и выполнения командлета.

Изменения в командлетах:

2) Foreach-Object

Добавилось три новых параметра:

SYNTAX
    ForEach-Object [-InputObject <psobject>] [-Begin <scriptblock>] [-Process] <scriptblock[]> [-End <scriptblock>]
    [-RemainingScripts <scriptblock[]>] [-WhatIf] [-Confirm] [<CommonParameters>]

    ForEach-Object [-InputObject <psobject>] [-MemberName] <string> [-ArgumentList <Object[]>] [-WhatIf] [-Confirm]
    [<CommonParameters>]


PARAMETERS
    -RemainingScripts <scriptblock[]>

        Required?                    false
        Position?                    named
        Accept pipeline input?       true (FromRemainingArguments)
        Parameter set name           ScriptBlockSet
        Aliases                      None
        Dynamic?                     false

    -MemberName <string>

        Required?                    true
        Position?                    0
        Accept pipeline input?       false
        Parameter set name           PropertyAndMethodSet
        Aliases                      None
        Dynamic?                     false

    -ArgumentList <Object[]>

        Required?                    false
        Position?                    named
        Accept pipeline input?       true (FromRemainingArguments)
        Parameter set name           PropertyAndMethodSet
        Aliases                      Args
        Dynamic?                     false

тров – это лишь мои предположения.
1)  MemberName – задает имя выполняемого .Net метода или свойства.

2)  ArgumentList – задает набор параметров,передаваемых методу.

3)  RemainingScripts – назначение пока не совсем понятно

Примеры:

#Вызовем метод GetType и получим тип объекта
ForEach-Object -InputObject (Get-Item C:\Windows) -MemberName GetType

#Отобразим значение свойства Length
ForEach-Object -InputObject (Get-Item C:\Windows\win.ini) -MemberName Length

#Переместим файл с помощью метода MoveTo
ForEach-Object -InputObject (Get-Item C:\Test\my.txt) -MemberName Length -ArgumentList "C:\newname.txt"

#Выполним метод Add над hashtable (создадим $hash = @{})
ForEach-Object -InputObject $hash -MemberName Add -ArgumentList "Date",(Get-Date)

Read Full Post »

На просторах интернета, можно найти новую версию, ранний билд  Windows 8 Milestone 3 build 7959. В этой версии Windows, ожидается третья  версия PowerShell. Сегодня, затрону, малую часть изменений.

Начнем с вывода версии PowerShell используя встроенную переменную $PSVersionTable(появилась в V2).

PS C:\Users\Administrator_ploc> $psversiontable

Name                           Value
----                           -----
PSVersion                      3.0
PSCompatibleVersions           {1.0, 2.0, 3.0}
BuildVersion                   6.2.7959.0
CLRVersion                     4.0.30319.16698
WSManStackVersion              2.0
PSRemotingProtocolVersion      2.102
SerializationVersion           1.1.0.1

Что сразу бросается в глаза:

1)  PSVersion = 3.0 – версия PowerShell

2)      BuildVersion – более свежая сборка

3)      CLRVersion – по умолчанию поддержка .Net 4.0(для предыдущих версий PowerShell требовалось ручное вмешательство, подробнее можно прочитать в блоге Mvp по PowerShell Thomas Lee — http://tfl09.blogspot.com/2010/08/using-newer-versions-of-net-with.html  или совсем экзотический и не рекомендуется к применению, но для общего развития будет полезно указать http://community.bartdesmet.net/blogs/bart/archive/2010/07/06/hosting-windows-powershell-2-0-under-clr-4-0.aspx).

4)      PSRemotingProtocolVersion – обновилась версия протокола(предыдущая версия 2.1)

Изменения в командлетах:

1)      Get-ChildItem

Так как на ранних стадиях справка ограничена по командлету, то с помощью Get-Help ,мы  можем посмотреть какие есть параметры.

-Directory

    Required?                    false
    Position?                    named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      ad, d
    Dynamic?                     true

-File

    Required?                    false
    Position?                    named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      af
    Dynamic?                     true

-Hidden

    Required?                    false
    Position?                    named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      ah, h
    Dynamic?                     true

-ReadOnly

    Required?                    false
    Position?                    named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      ar
    Dynamic?                     true

-System

    Required?                    false
    Position?                    named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      as
    Dynamic?                     true

Все новые параметры, являются объектом типа SwitchParameter.В версии V2 командлет Get-Help отображал информацию,что параметр имеет тип SwitchParameter.

Для определения типа параметра можно использовать командлет Get-Command(только не используйте альясы в качестве параметров,т.к свойство  ParameterSets будет пустое).

Как пример приведу для параметра System и ReadOnly:

PS > (gcm get-childitem).ParameterSets
Parameter Name: ReadOnly
  ParameterType = System.Management.Automation.SwitchParameter
  Position = -2147483648
  IsMandatory = False
  IsDynamic = True
  HelpMessage =
  ValueFromPipeline = False
  ValueFromPipelineByPropertyName = False
  ValueFromRemainingArguments = False
  Aliases = {ar}
  Attributes =
    System.Management.Automation.AliasAttribute
    System.Management.Automation.ParameterAttribute

Parameter Name: System
  ParameterType = System.Management.Automation.SwitchParameter
  Position = -2147483648
  IsMandatory = False
  IsDynamic = True
  HelpMessage =
  ValueFromPipeline = False
  ValueFromPipelineByPropertyName = False
  ValueFromRemainingArguments = False
  Aliases = {as}
  Attributes =
    System.Management.Automation.AliasAttribute
    System.Management.Automation.ParameterAttribute

Здесь мы прекрасно видим, что тип параметров, является SwitchParameter.

Вывод у командлета Get-Help,так же немного изменился, мы можем увидеть дополнительные поля, которые не отображались в версии V2(тот же результат можно получить используя команду выше — (gcm get-childitem).ParameterSets)):

1)  Parameter set name           (All)

К какому набору принадлежит данный параметр. Это свойство нам знакомо с введением в V2 Advanced Function(более подробно про параметр можно прочитать в about_Functions_Advanced_Parameters). Как видим All обозначает все наборы. Но можем встретить ситуацию, где есть уникальный параметр ,которые нельзя использовать с другими параметрами,в противном случае возникает ошибка.  Как пример возьмем параметр Path и LiteralPath(Parameter Set Name: LiteralItems), которые являются уникальными и нельзя использовать вместе. В версии V3 наглядно видно,к какому набору относится параметр, в версии V2,мы можем обратиться к свойству ParameterSets).

2)  Aliases                      as

Какой альяс имеет данный параметр.В версии V2 мы можем узнать используя ParameterSets.

3)  Dynamic?                     true

Примеры:

1)  Вывод объектов, которые имеют атрибут ReadOnly:


V2

Get-ChildItem C:\windows | Where {$_.IsReadOnly}

V3

Get-ChildItem C:\windows -ReadOnly

2)  Отобразить только файлы:


V2

Get-ChildItem C:\windows | Where {!$_.PsIsContainer}

V3

Get-ChildItem C:\windows -File

3)  Отобразить только каталоги:


V2

Get-ChildItem C:\windows | Where {$_.PsIsContainer}

V3

Get-ChildItem C:\windows -Directory

4)  Вывод объектов, которые имеют атрибут Hidden(используя альяс “h”,  только V3):


V2

Get-ChildItem C:\windows -Force | Where {$_.Attributes  -band [System.IO.FileAttributes]::Hidden}

V3

Get-ChildItem C:\windows -h

5)  Вывод объектов, которые имеют атрибут System:


V2

Get-ChildItem C:\windows -Force | Where {$_.Attributes  -band [System.IO.FileAttributes]::System}

V3

Get-ChildItem C:\windows -System

На этом пока остановимся,но теперь ,я думаю и вы станете рассматривать новые параметры и возможности PowerShell ,и делиться свои результатами.


					

Read Full Post »