Archiv pro měsíc: Srpen 2014

PowerShell – první kroky

Jednotlivé příkazy v PowerShellu se nazývají cmdlet [command-let].

Vypadají nějak takhle:
Get-Date vypíše aktuální datum a čas (vrátí objekt System.DateTime s aktuálním datem a časem)
Get-Location vypíše aktuální cestu; vše je objekt, takže vlastně vrátí objekt s aktuální cestou

Cmdlet se skládá ze slovesa a podstatného jména. Exustuje sada povolených sloves. Dostat ji můžeme cmdletem Get-Verb. Podstatné jméno je vždy v jednotném čísle.

Bezpečnost
Soubory s PowerShell skriptem mají koncovku .ps1. Implicitně se otevírá v notepadu. Skript v aktuální složce nelze spustit pouhým zadáním názvu skriptu. Je potřeba použít konvenci ./skript.ps1.

Bezpečnostní politiky

  • Unrestricted – povoluje spouštění všech skriptů
  • RemoteSigned – vyžaduje digitální podpis u skriptů, které nepocházejí z lokálního počítače
  • AllSigned – všechny skripty musí být podepsané
  • Restricted – implicitní politika; je zakázáno spouštět jakékoliv skripty; lze spouštět pouze příkazy zadané ručně do konzole

Get-ExecutionPolicy zobrazí aktuální bezpečnostní politiku
Set-ExecutionPolicy RemoteSigned změní politiku, umožní spuštět skripty pocházející z aktuálního počítače

Get-Help about_signing nápověda k politikám

Nápověda
Get-Help log vyhledá témata nápovědy s výskytem „log“
Get-Help Get-Date vypíše nápovědu pro cmdlet Get-Date
Get-Help Get-Date -Full vypíše plnou nápovědu pro cmdlet
Get-Help Get-Date -Examples vypíše pouze příklady z nápovědy
Help Get-Date -Full vypíše plnou nápovědu, ale výstup bude stránkovat

Objekty
PowerShell pracuje s objekty, které mají vlastnosti a metody.

Get-Date vrátí objekt DateTime
$a = Get-Date do proměnné $a se uloží objekt DateTime
$a.Month vrátí vlastnost Month objektu DateTime
$a.AddMonth(2) vrátí objekt DateTime zvětšený o dva měsíce oproti objektu $a

Roura
Objekty jsou z jednoho příkazu předávány do dalšího pomocí roury |.
Get-Date | Get-Member Get-Date vytvoří objekt DateTime a pošle ho do cmdeltu Get-Member, který ho zanalyzuje a vypíše typ objektu, jeho vlastnosti a metody

Práce s objekty
Get-Process | ForEach-Object{Write-Host $_.name} pro každý proces zapíše jeho název na konzoli
Get-Process | Where-Object{$_.CPU -gt 100} vrátí procesy, kde CPU > 100
Get-Process | Select-Object Name, CPU vrátí objekt, který bude mít pouze vlastnosti Name a CPU, už to nebude objekt procesu a nepůjde na něj volat metody procesu

Pár cmdletů do začátku
Get-Command vrátí příkazy, které je možné volat
Get-Command *-Object Vrátí příkazy, které je možné volat nad objektem
Get-Module vrátí moduly, které jsou nebo mohou být naimportovány
Get-Alias -Name dir vrátí definici aliasu dir
Get-Alias -Definition Get-ChildItem vrátí aliasy cmdletu Get-ChildItem

Format- formátuje výstup do konzole, již nevrací objekty
Get-Process | Format-List Name, CPU vypíše požadované vlastnosti, každou na nový řádek
Get-Process | Format-Table Name, CPU vypíše požadované vlastnosti do tabulky

SELECT do proměnné

Bolestivě jsem zjistil, že je propastný rozdíl mezi

SELECT @prom = 5 FROM sys.objects WHERE 1 = 0

a

SET @prom = ( SELECT 5 FROM sys.objects WHERE 1 = 0)

První dotaz proměnnou neovlivní. Druhý nastaví dle očekávání hodnotu NULL.

Kompletní příklad.

DECLARE @prom INT = 1
SELECT @prom = 5 FROM sys.objects WHERE 1 = 0
SELECT @prom --vypise 1
SET @prom = ( SELECT 5 FROM sys.objects WHERE 1 = 0)
SELECT @prom --vypise NULL