Sdílet prostřednictvím


Kapitola 5 – Formátování, aliasy, poskytovatelé, porovnání

Požadavky

Modul SqlServer PowerShell je nezbytný pro některé příklady uvedené v této kapitole. Další informace o modulu SqlServer PowerShell a instrukcích k instalaci najdete v tématu přehled SQL Server PowerShell. Používá se také v dalších kapitolách. Stáhněte a nainstalujte ho na počítač s testovacím prostředím Windows.

Správné formátování

V kapitole 4 jste se naučili filtrovat co nejvíce vlevo. Pravidlo pro ruční formátování výstupu příkazu je podobné ho, s výjimkou toho, že se musí co nejvíce nacházet napravo.

Nejběžnější příkazy formátu jsou Format-Table a Format-List. Format-Wide a Format-Custom lze použít také, ale jsou méně časté.

Jak je uvedeno v kapitole 3, příkaz, který vrátí více než čtyři vlastnosti, se ve výchozím nastavení zobrazí jako seznam, pokud není použito vlastní formátování.

Get-Service -Name w32time |
    Select-Object -Property Status, DisplayName, Can*
Status              : Running
DisplayName         : Windows Time
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True

Použijte rutinu Format-Table k ručnímu přepsání formátování a zobrazení výstupu v tabulce místo seznamu.

Get-Service -Name w32time |
    Select-Object -Property Status, DisplayName, Can* |
    Format-Table
Status  DisplayName  CanPauseAndContinue CanShutdown CanStop
------  -----------  ------------------- ----------- -------
Running Windows Time               False        True    True

Výchozí výstup pro Get-Service je tři vlastnosti v tabulce.

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

Pomocí rutiny Format-List můžete přepsat výchozí formátování a vrátit výsledky v seznamu.

Get-Service -Name w32time | Format-List

Všimněte si, že přesměrování Get-Service do Format-List způsobilo vrácení dalších vlastností. K tomu nedochází u každého příkazu kvůli tomu, jak je formát konkrétního příkazu nastavený na pozadí.

Name                : w32time
DisplayName         : Windows Time
Status              : Running
DependentServices   : {}
ServicesDependedOn  : {}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
ServiceType         : Win32OwnProcess, Win32ShareProcess

Nejdůležitější věc, kterou byste si měli uvědomit u formátovacích rutin, je, že vytvářejí formátovací objekty, které jsou odlišné od normálních objektů v PowerShellu.

Get-Service -Name w32time | Format-List | Get-Member
   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Obj...
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
autosizeInfo                            Property   Microsoft.PowerShell.C...
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef...
groupingEntry                           Property   Microsoft.PowerShell.C...
pageFooterEntry                         Property   Microsoft.PowerShell.C...
pageHeaderEntry                         Property   Microsoft.PowerShell.C...
shapeInfo                               Property   Microsoft.PowerShell.C...


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Obj...
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef...
groupingEntry                           Property   Microsoft.PowerShell.C...
shapeInfo                               Property   Microsoft.PowerShell.C...


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Obj...
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef...
formatEntryInfo                         Property   Microsoft.PowerShell.C...
outOfBand                               Property   bool outOfBand {get;set;}
writeStream                             Property   Microsoft.PowerShell.C...


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Obj...
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef...
groupingEntry                           Property   Microsoft.PowerShell.C...


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Obj...
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   string ClassId2e4f51ef...
groupingEntry                           Property   Microsoft.PowerShell.C...

To znamená, že příkazy pro formátování nelze převést na většinu ostatních příkazů. Dají se převést na některé příkazy Out-*, ale to je všechno. To je důvod, proč chcete provést jakékoli formátování na konci řádku (formát vpravo).

Přezdívky

Alias v PowerShellu je kratší název příkazu. PowerShell obsahuje sadu předdefinovaných aliasů a můžete také definovat vlastní aliasy.

Rutina Get-Alias slouží k vyhledání aliasů. Pokud už alias příkazu znáte, použije se parametr Name k určení, k jakému příkazu je alias přidružený.

Get-Alias -Name gcm
CommandType     Name                                               Version
-----------     ----                                               -------
Alias           gcm -> Get-Command

Pro hodnotu parametru Name lze zadat více aliasů.

Get-Alias -Name gcm, gm
CommandType     Name                                               Version
-----------     ----                                               -------
Alias           gcm -> Get-Command
Alias           gm -> Get-Member

Parametr Name bývá často vynechán, protože se jedná o poziční parametr.

Get-Alias gm
CommandType     Name                                               Version
-----------     ----                                               -------
Alias           gm -> Get-Member

Pokud chcete najít aliasy pro příkaz, musíte použít parametr Definition.

Get-Alias -Definition Get-Command, Get-Member
CommandType     Name                                               Version
-----------     ----                                               -------
Alias           gcm -> Get-Command
Alias           gm -> Get-Member

Parametr Definition nelze použít jako poziční argument, takže je nutné ho zadat explicitně.

Aliasy vám můžou ušetřit několik klávesových úhozů a jsou v pořádku, když zadáváte příkazy do konzole. Neměly by se používat ve skriptech ani v žádném kódu, který ukládáte nebo sdílíte s ostatními. Jak už bylo zmíněno dříve v této knize, použití úplných názvů rutin a parametrů je samo-vysvětlující a je snadnější na pochopení.

Při vytváření vlastních aliasů buďte opatrní, protože existují jenom v aktuální relaci PowerShellu na vašem počítači.

Poskytovatelé

V PowerShellu je poskytovatel rozhraní, které umožňuje přístup k úložišti dat způsobem podobným souborovému systému. PowerShell obsahuje několik předdefinovaných poskytovatelů.

Get-PSProvider

Jak vidíte v následujících výsledcích, existují předdefinované zprostředkovatele pro registr, aliasy, proměnné prostředí, systém souborů, funkce, proměnné, certifikáty a WSMan.

Name                 Capabilities                 Drives
----                 ------------                 ------
Registry             ShouldProcess, Transactions  {HKLM, HKCU}
Alias                ShouldProcess                {Alias}
Environment          ShouldProcess                {Env}
FileSystem           Filter, ShouldProcess, Cr... {C, D}
Function             ShouldProcess                {Function}
Variable             ShouldProcess                {Variable}

Jednotky skutečně používané těmito poskytovateli k poskytnutí svého úložiště dat je možné určit pomocí rutiny Get-PSDrive. Cmdlet Get-PSDrive nejen zobrazuje jednotky poskytované poskytovateli, ale také logické jednotky Windows, včetně jednotek mapovaných na sdílené síťové složky.

Get-PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Alias                                  Alias
C                  18.56        107.62 FileSystem    C:\
Cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

Moduly třetích stran, jako jsou modul ActiveDirectory PowerShellu a modul SqlServer PowerShellu, přidávají vlastního poskytovatele PowerShellu i PSDrive.

Importujte moduly PowerShellu ActiveDirectory a SqlServer.

Import-Module -Name ActiveDirectory, SQLServer

Zkontrolujte, jestli se přidali další poskytovatelé PowerShellu.

Get-PSProvider

Všimněte si, že v následující sadě výsledků teď existují dva noví poskytovatelé PowerShellu, jeden pro Active Directory a druhý pro SQL Server.

Name                 Capabilities                       Drives
----                 ------------                       ------
Registry             ShouldProcess, Transactions        {HKLM, HKCU}
Alias                ShouldProcess                      {Alias}
Environment          ShouldProcess                      {Env}
FileSystem           Filter, ShouldProcess, Credentials {C, A, D}
Function             ShouldProcess                      {Function}
Variable             ShouldProcess                      {Variable}
ActiveDirectory      Include, Exclude, Filter, Shoul... {AD}
SqlServer            Credentials                        {SQLSERVER}

Přidali jsme také PSDrive pro každý z těchto modulů.

Get-PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
A                                      FileSystem    A:\
AD                                     ActiveDire... //RootDSE/
Alias                                  Alias
C                  19.38        107.13 FileSystem    C:\
Cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
SQLSERVER                              SqlServer     SQLSERVER:\
Variable                               Variable
WSMan                                  WSMan

Ke službě PSDrive se dá přistupovat stejně jako k tradičnímu systému souborů.

Get-ChildItem -Path Cert:\LocalMachine\CA
   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\CA

Thumbprint                                Subject
----------                                -------
FEE449EE0E3965A5246F000E87FDE2A065FD89D4  CN=Root Agency
D559A586669B08F46A30A133F8A9ED3D038E2EA8  OU=www.verisign.com/CPS Incorp....
109F1CAED645BB78B3EA2B94C0697C740733031C  CN=Microsoft Windows Hardware C...

Operátory porovnání

PowerShell obsahuje různé relační operátory, které slouží k porovnání hodnot nebo hledání hodnot, které odpovídají určitým vzorům. Následující tabulka obsahuje seznam operátorů porovnání v PowerShellu.

Všechny operátory uvedené v tabulce jsou necitlivé na velikost písmen. Pro rozlišování velkých a malých písmen umístěte před operátor c. Například -ceq je verzí porovnávacího operátoru equals (-eq), která rozlišuje malá a velká písmena.

Operátor Definice
-eq Rovná se
-ne Nerovná se
-gt Větší než
-ge Větší než nebo rovno
-lt Méně než
-le Menší nebo rovno
-like Shoda pomocí zástupného znaku *
-notlike Neodpovídá použití zástupného znaku *
-match Odpovídá zadanému regulárnímu výrazu.
-notmatch Neodpovídá zadanému regulárnímu výrazu.
-contains Určuje, jestli kolekce obsahuje zadanou hodnotu.
-notcontains Určuje, jestli kolekce neobsahuje konkrétní hodnotu.
-in Určuje, jestli je zadaná hodnota v kolekci.
-notin Určuje, jestli zadaná hodnota není v kolekci.
-replace Nahradí zadanou hodnotu.

Forma s velkým písmenem "PowerShell" je stejná jako forma s malým písmenem "powershell" při použití operátoru porovnání "rovná se".

'PowerShell' -eq 'powershell'
True

Není to stejné jako použití malá a velká písmena rozlišující verze operátoru porovnání equals.

'PowerShell' -ceq 'powershell'
False

Operátor pro porovnání nerovnosti obrátí podmínku.

'PowerShell' -ne 'powershell'
False

Operátory „větší než“, „větší nebo rovno“, „menší než“ a „menší nebo rovno“ fungují s řetězcovými i číselnými hodnotami.

5 -gt 5
False

Když použijete větší nebo rovná místo větší než v předchozím příkladu, vrátí se Boolean true, protože pět je rovno pěti.

5 -ge 5
True

Na základě výsledků z předchozích dvou příkladů můžete pravděpodobně odhadnout, jak funguje menší než nebo rovno.

5 -lt 10
True

Operátory -like a -match můžou být matoucí i pro zkušené uživatele PowerShellu. -like se používá se zástupnými znaky * a ? k provádění shod typu „like“.

'PowerShell' -like '*shell'
True

Operátor -match používá k provedení porovnávání regulární výraz.

'PowerShell' -match '^.*shell$'
True

Pomocí operátoru rozsahu uložte čísla 1 až 10 do proměnné.

$Numbers = 1..10

Určuje, jestli $Numbers proměnná obsahuje hodnotu 15.

$Numbers -contains 15
False

Určete, jestli obsahuje číslo 10.

$Numbers -contains 10
True

Operátor -notcontains obrátí logiku a zjistí, jestli proměnná $Numbers neobsahuje hodnotu.

$Numbers -notcontains 15

Předchozí příklad vrátí Boolean true, protože je pravda, že proměnná $Numbers neobsahuje 15.

True

Obsahuje číslo 10, ale při testování je to nepravda.

$Numbers -notcontains 10
False

Operátor porovnání -in byl poprvé představen v PowerShellu verze 3.0. Používá se k určení, jestli je hodnota v poli. Proměnná $Numbers je matice, protože obsahuje více hodnot.

15 -in $Numbers
False

Jinými slovy, -in provádí stejný test jako operátor porovnání, ale z opačného směru.

10 -in $Numbers
True

Patnáct není v poli $Numbers, takže v následujícím příkladu se vrátí nepravda.

15 -in $Numbers
False

Stejně jako operátor -containsnot obrátí logiku operátoru -in.

10 -notin $Numbers

Předchozí příklad vrátí hodnotu false, protože pole $Numbers obsahuje 10 a podmínka testuje, zda neobsahuje 10.

False

Určete, jestli patnáct není v poli $Numbers.

15 -notin $Numbers

15 není v poli $Numbers, takže vrátí Boolean true.

True

Operátor -replace dělá jen to, co byste si mysleli. Slouží k nahrazení něčeho. Zadáním jedné hodnoty se tato hodnota nahradí žádnou hodnotou. V následujícím příkladu nahradíte "Shell" s ničím.

'PowerShell' -replace 'Shell'
Power

Pokud chcete nahradit hodnotu jinou, zadejte novou hodnotu za vzor, který chcete nahradit. SQL Saturday v Baton Rouge je událost, na které se snažím každý rok přednášet. V následujícím příkladu je slovo "Sobota" nahrazeno zkratkou "Sat".

'SQL Saturday - Baton Rouge' -replace 'saturday','Sat'
SQL Sat - Baton Rouge

Existují také metody jako Replace(), které lze použít k nahrazení věcí podobných tomu, jak operátor replace funguje. Operátor -replace ale ve výchozím nastavení nerozlišuje malá a velká písmena a metoda Replace() rozlišuje malá a velká písmena.

'SQL Saturday - Baton Rouge'.Replace('saturday','Sat')

Všimněte si, že slovo "Sobota" není nahrazeno. Je to proto, že je zadaný v jiném případě než původní.

SQL Saturday - Baton Rouge

Pokud je slovo "Saturday" zadáno ve stejném případě jako původní, Replace() metoda provede nahrazení podle očekávání.

'SQL Saturday - Baton Rouge'.Replace('Saturday','Sat')
SQL Sat - Baton Rouge

Při použití metod transformace dat buďte opatrní, protože můžete narazit na nepředvídatelné problémy, jako je například selhání v testu zvaném "Turecko" . Příklad naleznete v mém blogovém článku, Použití Pester k testování kódu PowerShellu s jinými kulturami. Doporučuji používat operátory místo metod, kdykoli je to možné, aby se zabránilo těmto typům problémů.

I když lze použít relační operátory, jak je znázorněno v předchozích příkladech, obvykle je používám s rutinou Where-Object k provádění filtrování.

Shrnutí

V této kapitole jste se seznámili s několika tématy, včetně správného formátování, aliasů, poskytovatelů a porovnávacích operátorů.

Přezkoumání

  1. Proč je nutné provádět formátování co nejvíce vpravo?
  2. Jak zjistíte, jaká je skutečná rutina pro alias %?
  3. Proč byste neměli používat aliasy ve skriptech, které ukládáte, nebo kód, který sdílíte s ostatními?
  4. Zobrazte seznam adresářů na jednotkách přidružených k poskytovateli registru systému.
  5. Jaká je jedna z hlavních výhod použití operátoru replace místo metody replace?

Odkazy

Další kroky

V další kapitole se dozvíte o řízení toku, skriptování, smyčkách a podmíněné logice.