Ahoj – doufám, že se máš dobře.
Chci vám věnovat pár minut, abych vám mohl začít s PowerShellem, a to způsobem, který je podle mě méně ohromující, než jak jsem tenkrát našel většinu materiálů PowerShell. Protože jste mi řekli, že stále slyšíte o PowerShellu a že nemůžete říct, jak se do něj dostat.
První věc, kterou je třeba vědět, je, že to vypadá jako příkazový řádek na steroidech, ale mnohem užitečnější než příkazový řádek. Uvidíte, co tím myslím, jakmile to otevřete. Udělejme to, ale otevřeme to pomocí ‚Spustit jako správce‘, protože to jen pomáhá u některých ukázek. V reálném životě jej otevřete pouze s právy správce, pokud to opravdu potřebujete.
Klikněte tedy na tlačítko start a začněte psát PowerShell. Nechci, abyste otevírali ISE (zatím), stačí najít zástupce „Windows PowerShell“ a kliknout na něj pravým tlačítkem myši a vybrat „Spustit jako správce“.
Nyní, když je spuštěn, připněte jej na hlavní panel, abyste k němu měli příště rychlejší přístup. Pokud se pokusíte přijmout PowerShell, měli byste usnadnit jeho otevření.
Každopádně to okno... hned to vypadá, jako byste potřebovali vědět, co napsat. Ano to je správně. V ISE to mohlo být o něco jednodušší a Aaron Nelson (@sqlvariant) mi řekl, že nepoužívám ISE pokaždé, když něco dělám v PowerShellu, ale tady budeme v pořádku.
Začněme tím, že uděláme několik základních věcí, které známe z DOSu. Příkazy cd
a dir
. Zkuste toto:
cd .. dir
Uvidíte, že se přesunete nahoru do C:\WINDOWS
a poté vypište obsah. Žádné překvapení, je to jako příkazový řádek. Nebo DOS, pokud jste dost staří.
Rozdíl oproti PowerShellu je v tom, že se nejedná pouze o textový výstup. Tyto věci jsou objekty . A s tím můžeme dělat věci. PowerShell je „typované“ prostředí. S objekty již pracujete neustále, jako v Object Explorer v SSMS. Objekty PowerShellu mohou zahrnovat všechny tyto věci, stejně jako objekty .Net. Odtud získává PowerShell svou sílu.
Pár rychlých věcí…
- Příkazy PowerShellu se vyskytují ve dvojicích sloveso-podstatné jméno, jako je
Set-Location
neboGet-Content
neboGet-ChildItem
. Tyto rutiny jsou známé jako rutiny, takže když uvidíte slovo „cmdlet“, znamená to pouze příkaz PowerShellu. - Parametry příkazu PowerShell používají spojovník. Jako:
Get-ChildItem -Recurse
ale můžete je také zkrátit, pokud to není nejednoznačné. Takže bych mohl použít-rec
místo-recurse
. - Proměnné začínají znakem dolaru (
$
). K tomu se dostaneme později. - Nepoužíváme
>
ve filtrech a testech používáme-gt
.-eq
pro=
,-ne
pro!=
/<>
,-le
pro<=
, a tak dále. Je to frustrující, ale zvyknete si. - Existuje spousta zkratek a aliasů. Jeden alias pro
Set-Location
jecd
.Get-ChildItem
je také známý jakodir
als
také.Where-Object
je?
aForEach-Object
je%
. Uvidíme je za pochodu. - Dostanete doplňování tabelátorů téměř u všeho, takže pokud jste zadali
Get-Chi
, můžete stisknout Tab a procházet možnosti, dokud nenajdete, co chcete. - Můžete použít nápovědu (což je alias pro
Get-Help
) jednoduše pomocí:help dir
a ve spodní části této nápovědy dostanete pěkné připomenutí, že jste mohli použíthelp dir -examples
a přidání-online
by otevřeli webovou stránku s příslušnou stránkou nápovědy (to je opravdu užitečné). - Výsledky jedné věci můžete předávat do druhé pomocí symbolu svislé čáry (
|
). Snad nejužitečnější jegm
(alias proGet-Member
), který zobrazí vlastnosti a metody (členy) pro jakýkoli objekt, který jste předali. #
okomentuje řádek nebo přejde mezi<#
a#>
Podívejme se na některé z nich v akci.
Zde můžeme vidět některé zajímavé věci. Je dobré si všimnout, že bychom mohli použít -Exclude
a -Include
. Brzy to uděláme. Více informací bychom mohli získat pomocí -detailed
, nebo -examples
, nebo -full
.
Pojďme prozkoumat naši složku SQL. Začněte zadáním cd \p
a poté stiskněte
Nyní stiskněte M a začněte znovu klepat na Tab, abyste našli „Microsoft SQL Server“. Pokud zajdete příliš daleko, stiskněte Shift-Tab a přejděte zpět. (Aha, a pokud jste se měli podívat na D:
, pak začněte znovu s cd D:\p
– ale principy jsou stejné.)
Skvělý. Zmáčkneme Enter a uvidíme, že jsme změnili adresář.
Ale teď napišme:dir -rec -inc ConfigurationFile.ini
Po každém parametru jste mohli stisknout Tab a vidět, jak se rozšiřují do správnějších verzí. Mohli jste použít Get-ChildItem
být trochu přísnější. Je mi to ale celkem jedno. Když to spustíte, uvidíte seznam některých souborů. nevím, kolik jich dostaneš. Každý z nich označuje, že jste spustili instalaci serveru SQL Server. Ale jako odborník na SQL to víte. Jen jste možná nevěděli, jak snadno vám je může PowerShell vypsat.
OK. Doufejme, že pro to uvidíme nějaké využití.
Nyní s tímto výstupem něco uděláme. Chci říct ‚s těmito soubory‘, ale pojďme udělat věc s daty a představme si to jako datovou sadu souborů.
Předpokládejme, že je chceme spočítat. Mohl bych procházet výsledky pomocí ForEach-Object
(ale použiji zkratku %
) a inkrementovat proměnnou, kterou jsem nastavil. Toto je běžný vzorec pro opakování – lidé vkládají celé programy do těchto složených závorek přes mnoho řádků.
Tohle funguje, ale jsem si jistý, že je tam něco vestavěného, co mi umožní věci počítat.
No, nikdy si nemůžu vzpomenout, co to bylo za příkaz, takže se zeptejme jednoho z těch skvělých poskytovatelů internetového vyhledávání.
Ani se mi nechce otevírat tyto stránky. Chci si jen všimnout, že existuje příkaz s názvem Measure-Object
. Vložme do toho náš výstup. Stisknutím klávesy „šipka nahoru“ se vrátíte k předchozímu příkazu.
To chvíli trvá a pak nám šťastně řekne, že jsou tři.
Chvíli to trvá, protože je třeba znovu prohledávat soubory. Co kdybychom ty výsledky někam uložili?
Nyní těmto věcem říkám závorky, ale Američané jim říkají závorky. A čemu vy říkáte závorky, já říkám hranaté závorky. Existují také složené závorky, kterým podle mě říkáte závorky. Pokusím se nazvat závorky „kulatými závorkami“, aby nedošlo k záměně, ale pokud mluvím o „závorce“, mám na mysli závorku.
Zabalím svůj dir
příkaz v kulatých závorkách a přiřaďte jej k proměnné.
Nyní mohu kanál $configfilelist
do Measure-Object
a bude lépe reagovat, protože jsem si uložil své výsledky.
Ale protože $configfilelist
je pole souborů, mohu se také podívat na jeho délku, abych zjistil, že existují tři položky. To je mnohem jednodušší. A ke každému z nich mám přístup pomocí hranatých závorek od 0 do 2.
Tohle ještě není úplně převratná věc. Ale tyto soubory nám říkají některé užitečné věci. Pojďme udělat Get-Member
příkaz na našem poli.
Nenechte se tím odradit. Nahoře můžeme vidět, že máme co do činění s objekty typu System.IO.FileInfo
. Toto je věc .Net a odtud pochází síla. Vidíme, že bychom mohli zavolat Delete
metody těchto souborů nebo CopyTo
nebo Decrypt
(pokud byly zašifrovány, ale nejsou) a další. Dole vidíme Vlastnosti.
Tohle je zajímavější. Podívejme se na LastWriteTime
. Protože by nás mohlo zajímat, kdy to bude.
Můžeme použít Select-Object
ukázat pouze určité vlastnosti.
Podle očekávání se do těchto souborů nic nezapisuje, protože instalace byly skutečně provedeny. Ale co kdybych to chtěl filtrovat, pouze na jedničky od určitého okamžiku?
Budu používat Get-Date
abyste získali aktuální datum a čas. Zabalím to do kulatých závorek a použiji jeho AddYears
metoda k nalezení před rokem. V reálném světě bych se více přikláněl k použití AddDays
, ale chci získat nějaké výsledky.
A budu filtrovat $configfilelist
předáním do Where-Object
(kromě toho, že použiji pohodlnou zkratku, kterou je otazník). Můj filtr žije ve složených závorkách („složené závorky“, že?) a uvnitř těchto složených závorek odkazuji na věci v $configfilelist
pomocí $_
.
Můj filtr tedy vypadá takto a říkám, že chci uvést ty, které mají LastWriteTime
větší než (-gt
) před rokem:
A mám jen jeden soubor. Úžasný.
To je všechno v pořádku, ale teď chci vědět, o čem ta instalace byla. K tomu se musíme podívat do souboru. Get-Content
je tady náš přítel. Začněme pomocí Get-Content
přímo proti souboru. Později to bude snadné připojit k našemu správnému příkazu.
Get-Content
ve skutečnosti vrací pole řádků a má opravdu užitečné parametry jako -TotalCount
který se zastaví po určitém počtu řádků nebo -Tail
který dostane řádky na konec souboru. Líbí se mi to, když se zabývám velkými soubory – není to tak, že bych je mohl otevřít v poznámkovém bloku.
Řeknu vám o Select-String také. Je to jako grep
z Unixu – použijete jej k získání řádků, které chcete do souboru.
Tento výstup vypadá jako bolest, ale pamatujte, že se jedná pouze o řetězcovou reprezentaci objektu. Pokud zadám svůj příkaz potrubím do gm
(Get-Member
), uvidíte, co tím myslím.
Takže teď můžu říct, že mám přístup k Path
souboru, Line
, LineNumber
atd., samostatně.
Abych hledal více věcí, chci předat pole parametrů -Pattern
. Dělám to jednoduše pomocí čárky, abych zjistil, že šlo o instalaci Analysis Services.
Doufám, že začínáte vidět sílu tohoto.
Mohu to vše umístit na jeden řádek pomocí:
dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line
(Je nám líto, ale pravděpodobně budete muset posunout stránku, abyste to viděli – dostat vše na jeden řádek není v HTML zrovna ctnost.)
Když pracujete na věcech, které se vám líbí, budete chtít příkazy někde uložit na později (například do souboru .ps1, který spustíte). Chcete-li to provést, měli byste vědět o Get-History
. Uvádí vše, co jste v této relaci spustili.
A úhledný malý trik je, že můžete použít záporná čísla k připojení do polí z druhého konce. Takže můžete udělat toto:
Ale místo toho, abyste to jen zobrazovali, vložte to do clip
:
…který to dostane do schránky.
Nebudu v tom zacházet o moc dál, ale můžete to sami posouvat dál a dál a zkoumat typy věcí, které by mohly být na vaší práci zajímavé. Výsledky můžete uložit do souborů pomocí >
a připojit k souborům pomocí >>
.
Nyní zvažte příkazy jako:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error
...a představte si, co byste s tím mohli dělat.
Zkuste udělat:Import-Module SQLServer
Což vás pak pustí:
cd SQLSERVER:
A procházejte prostředí SQL, jako by to byl souborový systém.
Musím přiznat, že nemám tendenci používat PowerShell k takovému zkoumání SQL velmi často. Ale skutečnost, že mohu, mi jistě dává spoustu možností. Skutečnost, že bych mohl použít PowerShell k vytvoření dokumentu aplikace Word, jako to dělají na https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, nebo posílat e-maily, jak je popsáno na https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage nebo zavolejte webové služby (včetně služeb Azure Machine Learning), jak je popsáno na https://docs.microsoft .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest znamená, že s trochou představivosti můžete použít PowerShell k tomu, co chcete. Rád používám Invoke-SqlCommand k získání dat z SQL a jejich vložení do Invoke-WebRequest
získat skóre z Azure ML a poté odpovídajícím způsobem reagovat. PowerShell to dělá opravdu přímočarým.
Jo, a pro spouštění příkazů PowerShellu na jiných strojích (což může být samozřejmě docela užitečné), rychlé „vyhledávání na internetu“ mi ukázalo tuto užitečně vypadající stránku:https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/
V souboru můžete mít seznam počítačů a procházet jej takto:
Zkuste nějaké věci. Oklepejte se. A prozkoumejte, co všichni píší pro T-SQL úterý tento měsíc, pořádané Robem Sewellem (@sqldbawithbeard)
@rob_farley