Previous Page Page 3 of 25 in the PowerShell category Next Page

Всем желающим уже давно доступна для скачивания клиентская версия Windows 8 (Windows Developer Preview downloads), а подписчикам MSDN доступна и серверная версия — Windows Server 8. Я не буду говорить про все новшества новых систем, потому что мой бложек не выдержит столько ненависти в адрес Microsoft. Но как минимум одна вещь доставляет позитива — Windows PowerShell 3.0 и модули.

Возьмём некоторый типовой Windows Server 2008 R2 и посмотрим на встроенные модули, которые доступны «искаропки»:

PS C:\> (Get-Module -ListAvailable).Count 7 PS C:\> Get-Module -ListAvailable ModuleType Name ExportedCommands ---------- ---- ---------------- Manifest ADRMS {} Manifest AppLocker {} Manifest BestPractices {} Manifest BitsTransfer {} Manifest PSDiagnostics {} Manifest ServerManager {} Manifest TroubleshootingPack {} PS C:\>

совсем не густо — только 7 штук. А вот список модулей в Windows Server 8:

PS C:\> (Get-Module -ListAvailable).Count 62 PS C:\> Get-Module -ListAvailable Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules ModuleType Name ExportedCommands ---------- ---- ---------------- Manifest ActiveDirectory {Get-ADRootDSE, New-ADObject, Rename-ADObject, Move-ADObject...} Manifest ADDeploymentWF Invoke-ADCommand Manifest ADDSDeployment {Add-ADDSReadOnlyDomainControllerAccount, Install-ADDSForest, Install-AD... Manifest AppLocker {Set-AppLockerPolicy, Get-AppLockerPolicy, Test-AppLockerPolicy, Get-App... Manifest Appx {Add-AppxPackage, Get-AppxPackageManifest, Get-AppxPackage, Remove-AppxP... Manifest BestPractices {Get-BpaModel, Invoke-BpaModel, Get-BpaResult, Set-BpaResult} Manifest BitsTransfer {Add-BitsFile, Remove-BitsTransfer, Complete-BitsTransfer, Get-BitsTrans... Manifest BranchCache {Add-BCDataCacheExtension, Clear-BCCache, Disable-BC, Disable-BCDowngrad... Manifest CertificateServicesCmd... {Get-AdcsCertificationAuthorityConfigurationDefaults, Get-AdcsConfigurat... Manifest CimCmdlets {Get-CimInstance, Get-CimSession, New-CimSession, New-CimSessionOption...} Manifest ClusterAwareUpdating {Get-CauPlugin, Register-CauPlugin, Unregister-CauPlugin, Invoke-CauScan... Manifest DirectAccessClientComp... {Get-DASiteTableEntry, Set-DASiteTableEntry, Remove-DASiteTableEntry, Re... Manifest Dism Apply-Unattend Manifest DnsClient {Resolve-DnsName, Get-DNSClient, Set-DNSClient, Get-DNSClientCache...} Manifest DnsConfig {Get-DNSClient, Set-DNSClient, Get-DNSClientCache, Clear-DNSClientCache...} Binary DnsLookup Resolve-DnsName Manifest DnsNrpt {Get-DnsClientEffectiveNrptPolicy, Get-DnsClientNrptGlobal, Set-DnsClien... Manifest DnsServer {Clear-DnsServerCache, Get-DnsServerCache, Set-DnsServerCache, Show-DnsS... Manifest FailoverClusters {Add-ClusterCheckpoint, Add-ClusterDisk, Add-ClusterFileServerRole, Add-... Manifest FileServer {Get-SmbShareWF, Get-FsrmQuotaWF, Get-IscsiServerTargetWF, Get-IscsiVirt... Manifest GroupPolicy {Backup-GPO, Copy-GPO, Get-GPInheritance, Get-GPO...} Manifest iSCSI {Connect-iSCSIDiscoveredTarget, Disconnect-iSCSIDiscoveredTarget, Get-iS... Manifest KdsCmdlets {Get-KdsRootKey, Add-KdsRootKey, Test-KdsRootKey, Get-KdsConfiguration...} Manifest Microsoft.PowerShell.Core {Get-Command, Get-Help, Update-Help, Save-Help...} Manifest Microsoft.PowerShell.D... {Get-WinEvent, Get-Counter, Import-Counter, Export-Counter...} Manifest Microsoft.PowerShell.Host {Start-Transcript, Stop-Transcript} Manifest Microsoft.PowerShell.M... {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path...} Manifest Microsoft.PowerShell.S... {Get-Acl, Set-Acl, Get-PfxCertificate, Get-Credential...} Manifest Microsoft.PowerShell.U... {Format-List, Format-Custom, Format-Table, Format-Wide...} Manifest Microsoft.WSMan.Manage... {Disable-WSManCredSSP, Enable-WSManCredSSP, Get-WSManCredSSP, Set-WSManQ... Manifest MicrosoftiSCSITarget {Add-IscsiVirtualDiskTargetMapping, Checkpoint-IscsiVirtualDisk, Dismoun... Manifest MsDtc {New-DtcDiagnosticTransaction, Complete-DtcDiagnosticTransaction, Join-D... Manifest NetAdapter {Rename-NetAdapter, Set-NetAdapter, Get-NetAdapter, Enable-NetAdapter...} Manifest NetLbfo {Get-NetLbfoTeam, Remove-NetLbfoTeam, Set-NetLbfoTeam, New-NetLbfoTeam...} Manifest NetQos {Get-NetQosPolicy, Set-NetQosPolicy, Remove-NetQosPolicy, New-NetQosPolicy} Manifest NetSwitchTeam {Get-NetSwitchTeam, Remove-NetSwitchTeam, New-NetSwitchTeam, Rename-NetS... Manifest NetTCPIP {Get-NetIPAddress, Set-NetIPAddress, Remove-NetIPAddress, New-NetIPAddre... Manifest netwnv {New-NetVirtualizationAddress, Get-NetVirtualizationAddress, Remove-NetV... Manifest NetworkConnectivityStatus {Get-DAConnectionStatus, Get-NCSIPolicyConfiguration, Set-NCSIPolicyConf... Manifest NetworkSecurity {New-NetAuthenticationProposal, New-NetMainModeCryptoProposal, New-NetQu... Manifest NetworkTransition {Get-Net6to4Configuration, Set-Net6to4Configuration, Reset-Net6to4Config... Script PKI Manifest PKIClient {Get-AutoEnrollmentPolicy, Set-AutoEnrollmentPolicy, Export-Certificate,... Manifest PrintManagement {Get-Printer, Remove-Printer, Set-Printer, Add-Printer...} Manifest PS_MMAgent {Disable-MMAgent, Enable-MMAgent, Set-MMAgent} Manifest PSDiagnostics {Start-Trace, Stop-Trace, Enable-WSManTrace, Disable-WSManTrace...} Manifest PSScheduledJob {New-JobTrigger, Add-JobTrigger, Remove-JobTrigger, Get-JobTrigger...} Manifest PSWorkflow {Import-PSWorkflow, New-PSWorkflowExecutionOption} Manifest RDManagement {Grant-OrgUnitAccess, Test-OrgUnitAccess, Restart-ComputersAndBlock, Exp... Manifest ScheduledTasks {New-JobTrigger, Add-JobTrigger, Remove-JobTrigger, Get-JobTrigger...} Manifest SecureBoot {Confirm-SecureBootUEFI, Set-SecureBootUEFI, Get-SecureBootUEFI, Format-... Manifest ServerManager {Add-WindowsFeature, Remove-WindowsFeature} Manifest ServerManagerShell {WFAddRemoveServerComponentAsync, WFGetAlterationState, WFGetGuid, WFGet... Manifest SmbShare {Get-SmbShare, Remove-SmbShare, Set-SmbShare, Block-SmbShareAccess...} Manifest SmbWitness {Get-SmbWitnessCluster, Get-SmbWitnessClusterClient, Move-SmbWitnessClus... Manifest Storage {Add-InitiatorIdToMaskingSet, Add-PartitionAccessPath, Add-PhysicalDisk,... Manifest TelemetryManagement {Set-CEIP, Set-WER} Manifest TroubleshootingPack {Get-TroubleshootingPack, Invoke-TroubleshootingPack} Manifest TrustedPlatformModule {Get-Tpm, Initialize-Tpm, Clear-Tpm, Unblock-Tpm...} Manifest UserAccessLogging {Enable-Ual, Disable-Ual, Get-Ual, Get-UalDhcp...} Manifest Wdac {Get-OdbcDriver, Set-OdbcDriver, Get-OdbcDsn, Add-OdbcDsn...} Manifest Whea {Get-WheaMemoryPolicy, Set-WheaMemoryPolicy} PS C:\>

61 модуль!!!!1111одинодин (мой PKI модуль не в счёт). И это не считая тех, которые устанавливаются вместе с ролями сервера (как, например, модуль ServerBackup). Конкретно сейчас говорить об их возможностях ещё рано, потому что они функционально пока не готовы. Но мы можем представить себе, что это всё дружно заработает ближе к RTM. Из наиболее интересных вещей хочется обрать внимание на вот какие модули:

  • SmbShare

PS C:\> gcm -Module smbshare | select name Name ---- Block-SmbShareAccess Close-SmbOpenFile Close-SmbSession Get-SmbClientConfiguration Get-SmbClientNetworkInterface Get-SmbConnection Get-SmbConnectionNetworkInterface Get-SmbOpenFile Get-SmbServerConfiguration Get-SmbServerNetworkInterface Get-SmbSession Get-SmbShare Get-SmbShareAccess Grant-SmbShareAccess New-SmbConnection New-SmbShare Remove-SmbConnection Remove-SmbShare Revoke-SmbShareAccess Set-SmbClientConfiguration Set-SmbServerConfiguration Set-SmbShare Unblock-SmbShareAccess

что сильно намекает на то, что мой модуль ShareUtils прожил яркую, но короткую жизнь. Начиная с релиза Windows 8 проку от него особо не будет.

  • PKIClient

ВНЕЗАПНО!!! Команда пкитима (Windows PKI team), издавна прославляющая религиозно правильный certutil.exe и люто-бешено отрицающая PowerShell снизошла до того, чтобы доставить и свои (поверьте, он там не один!) модули в Windows 8. Или, как вариант, получили хороший нагоняй от Джефри Сновера. Windows PKI представлен двумя модулями — клиентским и серверным. Клиентский модуль представлен следующими командами:

PS C:\> gcm -Module pkiclient | select name Name ---- Add-EnrollmentPolicyServer Export-Certificate Export-PfxCertificate Get-AutoEnrollmentPolicy Get-Certificate Get-CertificateNotificationTask Get-EnrollmentPolicyServer Get-PfxData Import-Certificate Import-PfxCertificate New-CertificateNotificationTask New-SelfSignedCertificate Remove-CertificateNotificationTask Remove-EnrollmentPolicyServer Set-AutoEnrollmentPolicy Switch-Certificate Test-Certificate

Поскольку я немного разбираюсь в PKI и PowerShell, состав этого модуля меня несколько смутил, удивил, оздачил, загнал в тупик. Например, зачем было делать 2 отдельных командлета для экспорта и импорта сертификатов (один для простых сертификатов, другой исключительно для pkcs#12). Что делает Switch-Certificate для меня осталось загадкой. Кстати говоря, командлет Get-Certificate делает совсем не то, что вы подумали. Этот командлет выполняет энроллмент (запрос) сертификата. Всё-таки:

PS C:\> Get-Verb request Verb Group ---- ----- Request Lifecycle

Вобщем, на текущий момент модуль радует, но не впечатляет (если что, я вам не говорил, что 70% функционала модуля не работает вообще).

  • CertificateServicesCmdlets

Серверный модуль предназначен для управления службами сертификатов — Active Directory Certificate Services (ADCS). Когда я увидел модуль, чуть не описался от радости. Но заглянув в модуль моё лицо изобразило очень сложное выражение, похожее на постиранную радугу. Я не знаю, как выглядит постиранная радуга, но выглядит модуль примерно так:

PS C:\> gcm -Module CertificateServicesCmdlets | select name Name ---- Get-AdcsCertificationAuthorityConfigurationDefaults Get-AdcsConfigurationState Get-AdcsEnrollmentPolicyWebServiceConfigurationDefaults Get-AdcsEnrollmentWebServiceConfigurationDefaults Get-AdcsNetworkDeviceEnrollmentConfigurationDefaults Get-SSLCertificates Import-AdcsCertificationAuthorityCACertificatePfx Install-AdcsCertificationAuthority Install-AdcsEnrollmentPolicyWebService Install-AdcsEnrollmentWebService Install-AdcsNetworkDeviceEnrollmentService Install-AdcsOnlineResponder Install-AdcsWebEnrollment Uninstall-AdcsCertificationAuthority Uninstall-AdcsEnrollmentPolicyWebService Uninstall-AdcsEnrollmentWebService Uninstall-AdcsNetworkDeviceEnrollmentService Uninstall-AdcsOnlineResponder Uninstall-AdcsWebEnrollment

на сегодняшний день ни о каком управлении ADCS говорить не приходится, просто набор командлетов для установки/удаления компонентов ADCS. Однако, на удивление некоторые командлеты продуманы достаточно хорошо и даже работают! Т.е. функционально они будут очень полезны. С другой стороны, они оставили мне место для моего PowerShell PKI модуля. Разочаровывают 3 вещи:

  1. Get-SSLCertificates — за такое можно смело лупить ножкой от стула. Потому что минздравСновер не одобряет использование названий командлетов во множественном числе.
  2. Тот же get-SSLCertificates куда-то потерял свой префикс.
  3. Команда Windows PKI решила посоревноваться в специальной олимпиаде с командой Active Directory на самое длинное название командлета:

PS C:\> gcm -Module activedirectory -Name *password* | select name Name ---- Add-ADDomainControllerPasswordReplicationPolicy Add-ADFineGrainedPasswordPolicySubject Get-ADAccountResultantPasswordReplicationPolicy Get-ADDefaultDomainPasswordPolicy Get-ADDomainControllerPasswordReplicationPolicy Get-ADDomainControllerPasswordReplicationPolicyUsage Get-ADFineGrainedPasswordPolicy Get-ADFineGrainedPasswordPolicySubject Get-ADUserResultantPasswordPolicy New-ADFineGrainedPasswordPolicy Remove-ADDomainControllerPasswordReplicationPolicy Remove-ADFineGrainedPasswordPolicy Remove-ADFineGrainedPasswordPolicySubject Reset-ADServiceAccountPassword Set-ADAccountPassword Set-ADDefaultDomainPasswordPolicy Set-ADFineGrainedPasswordPolicy

И ни одного алиаса! Пока что Windows PKI впереди на 3 символа:

PS C:\> "Get-ADDomainControllerPasswordReplicationPolicyUsage".length 52 PS C:\> "Get-AdcsEnrollmentPolicyWebServiceConfigurationDefaults".length 55

Но мы поддержим команду Active Directory и обвиним команду Windows PKI в том, что у последних префикс на 2 символа длиннее (AD против ADCS), т.е. в итоге превосходство в 1 символ. Кому же достанется первый приз? :) Но мы поддержим обе команды и узнаем победителя с релизом Windows Server 8 :)

В пост про модули я хочу рассказать и про новую возможность автозавершения команд в PowerShell 3.0: при импорте модуля вы можете набрать Import-Module, нажать <tab> и tab expansion будет автозавершать имена модулей. Т.е. вам достаточно знать 1-2 первые буквы названия модуля и он у вас в кармане ;)

На сегодня всё. В следующий раз я постараюсь рассказать ещё что-нибудь интересное про PowerShell 3.0.

Tuesday, September 27, 2011 9:47:57 PM (FLE Daylight Time, UTC+03:00)   Comments [0]    

 

Disclaimer: данный обзор проводится по Dev Preview редакции Windows 8. Это даже не CTP и не Beta, поэтому любой функционал в финальной версии может быть изменён, добавлен или удалён.


В новой версии PowerShell появился и не менее новый (ВНЕЗАПНО) редактор или IDE для разработки скриптов PowerShell. По некоторым данным, новый PowerShell ISE это самый настоящий повергуикапец. И вот почему. Например, первый запуск ISE:

PowerShell ISE general look

Начнём с того, что мы видим. А видим сразу мы панель Commands, которая показывает список доступных командлетов. Так же, можете фильтровать их по модулям и по именам. Причём, поиск интерактивный. Но смысл этой панельки совсем не в том, чтобы просто показать какие командлеты у нас доступны, а больше:

ise2

Как видно, в этой панели есть графическая набиралка параметров. Вы можете заполнить параметры как нужно и потом с ними что-нибудь сделать. В параметры можно подавать массивы строк, разделяя их запятой (как и в обычной консоли). Например, если нажать кнопку Insert, соответствующая команда PowerShell (вместе с параметрами и аргументами) будет вставлена в панель консоли ISE (показано на скриншоте). Кнопка Copy копирует эту же строку в буфер обмена, так что вы можете её вставить в панель редактора. Так же можно заметить, что вы можете использовать разные наборы параметров (parameter set). Эта панелька будет интересна скорее новичкам, потому что все параметры на виду и кавычки будут проставлены автоматически. Но эта панелька может быть полезна и для не новичков, потому что:

Количество встроенных командлетов в PowerShell V2:

[↓] [vPodans] (gcm -com cmdlet).length 236

и в PowerShell 3.0:

PS C:\Users\Administrator> (gcm -com cmdlet).length 718

Почти в три раза больше и вполне можно затеряться в них.

А теперь, самый эпиквин:

Intellisense!

Intellisense!

Наконец-то появился вменяемый Intellisense! По кнопке [Tab] в редакторе автозавершаются имена переменных! Но есть один нюанс: прежде чем автозавершать имена переменных, код, в котором используется переменная должен быть запущен. Вариант, как в PowerGUI Script Editor'е (когда имена переменных в Intellisense появляются сразу, как они упоминуются в редакторе) пока что не работает. Ну и Intellisense для переменных пока что не предусмотрен, только табом переключать. Intellisense так же доступен для извлечения членов классов:

Intellisense!

Единственное, для чего не работает Intellisense: стандартные операторы (-eq, –ne, –like, –notlike, etc.) и классы .NET'а. Но это тоже должно появиться в будущем.

Online parser and outlinings

А вот здесь мы видим много интересного. В ISE появился outlining, т.е. можно сворачивать всякие конструкции (нажимая плюсики и минусики). И ещё появился онлайн парсер кода и если парсер видит что-то непотребное, он будет весьма недоволен и подчёркивать красной волнистой линией. Если навести курсор на неё, вылезет тултип (tooltip) c описанием ошибки. Я немного забежал вперёд и спалил новый параметр для цикла foreach: –parallel. Сейчас он не реализован, но обязательно будет в финальной версии. Суть всего этого — теперь цикл будет работать не последовательно, а параллельно! Я считаю это винрарным улучшением перформанса.

Bracket pairs

Вроде мелочь, а приятно! Теперь ISE показывает парные скобки (круглые, квадратные, фигурные), кавычки (одиночные, двойные, herestrings).

Snippets

В ISE теперь есть сниппеты :) И наконец-то поправили кодировку файлов с Unicode Big Endian (что доставляло немало лулзовкирпичей при запуске такого скрипта в консоле) на UTF8.

Если подвести краткий итог, PowerShell ISE сделал серьёзную заявку на право называться редактором для PowerShell. Причём, при определённых условиях (в зависимости от конечного функционала) ISE может стать моим основным редактором, даже не смотря на многолетнюю привычку использовать PowerGUI Script Editor. В любом случае, для новичков ISE будет хорошим стартом.

Friday, September 23, 2011 10:15:48 PM (FLE Daylight Time, UTC+03:00)   Comments [0]    

 

Очень сильно прозреваю, что я буду последним, кто сообщил эту новость и вы скорее всего получили эту информацию из более оперативных источников. Поэтому данный пост предназначен для тех, кто более розовый, чем я :).

Итак, на днях в открытый доступ выложили Windows Management Framework 3.0 CTP (Community Technology Preview), который содержит и PowerShell 3.0 (очевидно, что тоже ещё в стадии CTP). WMF3 устанавливается на системы Windows 7 и Windows Server 2008 R2. Владельцы других систем пока могут быть свободны. Краткий список нововведений есть на странице загрузки. Если у вас есть предыдущая версия WMF 3.0 (KB2508781 и KB2506143), её надо будет удалить, иначе возможны разные сюрпризы. И ещё раз ссылка для самых розовых:

>> Windows Management Framework 3.0 CTP <<

На этом пока всё. А в следующих разах расскажу про что-нибудь новое подробнее и как и почему случился повергуикапец :)

Wednesday, September 21, 2011 7:51:36 PM (FLE Daylight Time, UTC+03:00)   Comments [0]    

 

По просьбам трудящихся публикую скриптик, который подсчитывает хеш для файлов. Скрипт очень простой, он всего лишь выводит имя файла (полное) и значение хеша, который можно использовать как вам нужно.

function Get-FileHash {
[CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelinebyPropertyName = $true)]
        [string]$FullName,
        [ValidateSet("MD5","SHA1","SHA256","SHA384","SHA512")]
        [string]$Hash = "SHA1"
    )
    begin {
        function Test-FileLock ($file) {
            $locked = $false
            trap {
                Set-Variable -name locked -value $true -scope 1
                continue
            }
            $inputStream = New-Object system.IO.StreamReader $file
            if ($inputStream) {$inputStream.Close()}
            $locked
        }
        $Hasher = switch ($Hash) {
            "MD5" {[System.Security.Cryptography.MD5]::Create()}
            "SHA1" {[System.Security.Cryptography.SHA1]::Create()}
            "SHA256" {[System.Security.Cryptography.SHA256]::Create()}
            "SHA384" {[System.Security.Cryptography.SHA384]::Create()}
            "SHA512" {[System.Security.Cryptography.SHA512]::Create()}
        }
    }
    
    Process {
        $file = gi (Resolve-Path $FullName) -Force
        if ($file -is [IO.FileInfo]) {
            if (Test-FileLock $file) {return}
            $inputStream = New-Object System.IO.StreamReader ($file)
            $hashBytes = $hasher.ComputeHash($inputStream.BaseStream)
            $inputStream.Close()
            $builder = New-Object System.Text.StringBuilder
            $hashBytes | %{[void]$builder.Append($_.ToString("X2"))}
            New-Object psobject -Property @{
                FullName = $file.ToString()
                Hash = $builder.ToString()
            }
        }
    }
}

Использование простое: dir c:\folder | Get-FileHash

или с указанием другого алгоритма (по умолчанию SHA1): dir c:\folder -recurse | Get-FileHash -Hash sha256

Но, всё же, для отслеживания изменённых файлов советую использовать мой PSFCIV, который специально заточен под это дело и позволяет не только считать хеши, но и проверять их.

Monday, August 22, 2011 11:48:10 AM (FLE Daylight Time, UTC+03:00)   Comments [1]    

 

В прошлый раз мы рассмотрели основные вопросы массивов и управления ими в Windows PowerShell. Мы теперь знаем, как они создаются, как изменять их размер (ресайзить) и какие математические операции можно проводить над массивами. В этой части я расскажу о сравнении массивов, поиске элементов и т.д.

Сравнение массивов

Как известно, в PowerShell есть куча операторов (или групп операторов) сравнения, как –eq и –like. Но здесь у нас сразу появляется проблема — эти операторы нельзя использовать для сравнения массивов. Давайте посмотрим, что получится:

[↓] [vPodans] "abc" -eq "abc" True [↓] [vPodans] 1,2,3 -eq 1,2,3 [↓] [vPodans]

Оператор –eq ничего не вернул. Дело в том, что справа от оператора –eq может быть только один объект, буква, строка, число и т.д. В контексте массивов оператор –eq можно использовать для получения элементов массива, содержащих конкретное значение. Например, у нас есть массив из нескольких чисел и мы хотим узнать сколько раз конкретное число использовано в массиве. Вот простой пример:

[↓] [vPodans] 2,8,5,6,2,5,4,2,7 -eq 2 2 2 2 [↓] [vPodans] 2,8,5,6,2,5,4,2,7 -eq 5 5 5 [↓] [vPodans] 2,8,5,6,2,5,4,2,7 -eq 1 [↓] [vPodans] (2,8,5,6,2,5,4,2,7 -eq 2).Length 3 [↓] [vPodans] (2,8,5,6,2,5,4,2,7 -eq 5).Length 2 [↓] [vPodans] (2,8,5,6,2,5,4,2,7 -eq 1).Length 0 [↓] [vPodans]

Из показанных примеров мы видим, что оператор –eq возвращает элементы, которые соответствуют сравниваемому объекту. Поэтому при помощи оператора –eq можно узнать, содержит ли массив конкретное значение или нет и если да, то сколько раз. То же самое относится и к оператору –like, который больше подходит для сравнения строк по маске:

[↓] [vPodans] "abc","cba","bac","bca" -like "a*" abc [↓] [vPodans] "abc","cba","bac","bca" -like "?b?" abc cba [↓] [vPodans]

Здесь используется тот же принцип, что и с использованием оператора –eq, только с разницей, что оператор –like сравнивает по маске (нестрогое соответствие).

Для точного сравнения двух массивов следует использовать командлет Compare-Object:

[↓] [vPodans] Compare-Object 1,2,3 1,2,3 [↓] [vPodans] Compare-Object 1,2,3 1,2 InputObject SideIndicator ----------- ------------- 3 <= [↓] [vPodans] Compare-Object 1,2,3 1,2,2 InputObject SideIndicator ----------- ------------- 2 => 3 <= [↓] [vPodans]

Если массивы одинаковые, командлет ничего не вернёт. Если же есть различия, вы увидите, какие элементы отсутствуют в одном массиве (направление стрелочки указывает от массива с недостающим элментом). Может быть и так, что оба массива одинаковы по размеру, но какие-то элементы имеют разные значения. Тогда вы увидите стрелочки в оба направления. Командлет Compare-Object может выводить и одинаковые элементы:

[↓] [vPodans] Compare-Object -ref 1,2,3 -dif 1,2,2 -IncludeEqual InputObject SideIndicator ----------- ------------- 1 == 2 == 2 => 3 <= [↓] [vPodans]

В одинаковых элементах SideIndicator будет показывать двойной знак равенства (==).

Поиск по массиву

Иногда бывает очень нужным найти индекс элемента массива, значение которого совпадает с какой-то величиной. К сожалению, в PowerShell нет стандартного механизма поиска индексов. Во времена, когда я в повершеле был ещё совсем чайником, Вася Гусев написал мне простенький ванлайнер, который выводит индексы элементов массивов, значения которых совпали по какой-то маске:

 

function findinarr ($array, $value) {for ($i=0; $i -lt $array.count;$i++){if($array[$i] -eq $value){$i}}}

или более развёрнутый вариант:

function findinarr ($array, $value) {
    for ($i=0; $i -lt $array.count;$i++) {
        if($array[$i] -eq $value){$i}
    }
}

Например, узнать, индекс (или индексы) элемента массива, который содержит цифру 2 и 5:

[↓] [vPodans] $a = 2,8,5,6,2,5,4,2,7 [↓] [vPodans] findinarr $a 2 0 4 7 [↓] [vPodans] findinarr $a 5 2 5 [↓] [vPodans]

Мы видим, что цифра 2 в указанном массиве содержится в элементах с индексами 0, 4 и 7, а цифра 5 в элементах с индексами 2 и 5. Не забудьте, что индексы в массивах начинаются с нуля.

Форматирование массивов

PowerShell отображает массивы в столбик, т.е. каждый элемент массива показывается на новой строке. А если вы хотите показать массив так, чтобы все элементы были в строчку, разделённой пробелами? Можно извратиться конструкцией вида:

$a = 1..100
$string = ""
$a | ForEach-Object {$string += "$_" + " "}

[↓] [vPodans] $a = 1..100 [↓] [vPodans] $string = "" [↓] [vPodans] $a | ForEach-Object {$string += "$_" + " "} [↓] [vPodans] $string 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 72 73 74 75 76 77 78 79 80 81 82 8 3 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [↓] [vPodans]

Но можно сделать ещё круче — заключить переменную с массивом в двойные кавычки:

[↓] [vPodans] $a = 1..100 [↓] [vPodans] "$a" 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 72 73 74 75 76 77 78 79 80 81 82 8 3 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [↓] [vPodans]

как видите, результат точно такой же, только кода израсходовано куда меньше.

Преобразование строк в массивы и обратно

Далеко не всегда мы имеем возможность получить готовый массив, наоборот, нам нужно разбить одну строку на массив строк. Для этого можно использовать метод Split() класса System.String или оператор –split:

[↓] [vPodans] "this is a single string".split() this is a single string [↓] [vPodans] -split "this is a single string" this is a single string [↓] [vPodans]

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

[↓] [vPodans] "00-18-DE-54-57-8E" -split "-" 00 18 DE 54 57 8E [↓] [vPodans]

Причём, обратите внимание, что оператор –split может быть как унарным (когда всё располагается только справа от оператора), так и бинарным (когда исходная строка находится слева от оператора, остальное располагается справа). Более подробно про оператор –split лучше всего прочитать в справке: http://technet.microsoft.com/en-us/library/dd347708.aspx. Функционал оператора достаточно интересен, но выходит за рамки рассматриваемой статьи.

Есть ещё один трюк, как разделить строку на массив символов. Для этого используется метод ToCharArray():

[↓] [vPodans] "00-18-DE-54-57-8E".tochararray() 0 0 - 1 8 - D E - 5 4 - 5 7 - 8 E [↓] [vPodans]

Есть ещё один трюк, как разбить строку на массив символов. Для этого надо строку привести к массиву символов (char[]) и результат будет точно такой же:

[char[]]"00-18-DE-54-57-8E"

Если у вас есть массив и его нужно преобразовать в одну строку, можно воспользоваться статическим методом Join() класса System.String или оператором –join:

[↓] [vPodans] $a = 1..10 [↓] [vPodans] $a 1 2 3 4 5 6 7 8 9 10 [↓] [vPodans] [string]::Join(",",$a) 1,2,3,4,5,6,7,8,9,10 [↓] [vPodans] $a -join "," 1,2,3,4,5,6,7,8,9,10 [↓] [vPodans] -join $a 12345678910 [↓] [vPodans]

Как видно из примера, оператор –join так же, как и –split бывает унарным и бинарным. Бинарная форма всегда используется, когда нужно явно указать разделитель или другие параметры оператора –join.  Если оператор унарный, он не принимает явный разделитель и просто последовательно пристыковывает элементы массива в строку. Если вам нужно преобразовать несколько массивов в строки с использованием одного и того же разделителя, в PowerShell можно использовать специальную переменную $ofs и массив явно привести к типу string:

[↓] [vPodans] $ofs = "+" [↓] [vPodans] [string]$a 1+2+3+4+5+6+7+8+9+10 [↓] [vPodans] iex ([string]$a) 55 [↓] [vPodans]

Как можно видеть из примеров, с массивами в PowerShell можно делать что угодно (кроме вычитания и деления). Причём, зачастую, существует несколько способов выполнить одну и ту же задачу.

Реверсирование массивов

Вообще это используется не так часто, что можно было бы и опустить, но я достаточно часто работаю с CryptoAPI и бывает нужным первернуть массив. Дело в том, что CryptoAPI до мозга костей little-endian, а остальные API (даже тот же .NET) как правило big-endian. И чтобы перевернуть массив верх тормашками можно использовать статический метод Reverse() класса System.Array:

[↓] [vPodans] $a = 1..5 [↓] [vPodans] $a 1 2 3 4 5 [↓] [vPodans] [array]::Reverse($a) [↓] [vPodans] $a 5 4 3 2 1 [↓] [vPodans]

Следует учитывать, что этот метод меняет порядок следования элементов в самой перменной и не образует выходной информации.

Эпилог

В качестве эпилога скажу, что я рассмотрел лишь самые популярные действия с массивами и это составляет лишь малую часть того, что с ними можно сделать в реальности. Но этого материала (включая предыдущую статью) вам хватит на 95% случаев. И на этом всё.

Sunday, July 31, 2011 10:26:09 PM (FLE Daylight Time, UTC+03:00)   Comments [1]    

 

Previous Page Page 3 of 25 in the PowerShell category Next Page
 · 

All content © 2008 - 2012, Vadims Podāns
"Spaces" Theme provided by: Vadims Podāns
About


E-mail - Send mail to the author(s)
Live Messenger -
For english language visitors
Библиотека
Календарик
<May 2012>
SunMonTueWedThuFriSat
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

Карта расположения посетителей
Favorites





Fan list



Disclaimer
Вся информация на сайте предоставляется на условиях «как есть», без предоставления каких-либо гарантий и прав.

При использовании материалов c данного сайта ссылка на оригинальный источник обязательна.
Protected by Copyscape Online Plagiarism Scanner