Moja ściągawka (zapewne tylko do użytku własnego) …
1: Podstawy   2: RegExp   3: Ustawienia   4: Array   5: Pliki   6: Operator @   7: Właściwości mutim. plików   8: Odczyt rejestru Windows   9: Zarządzanie aplikacjami - CLI   # Nie będziesz używał!  

0: skondensowana przypominajka bez objaśnień

($x='coś') , "2+3=$(2+3)`n" , @(), ${a b}
Write-Host "`$x: $x" -ForegroundColor Yellow
prawie jak py repr(): $o.ToString() | ConvertTo-Json

1: Podstawy

() - wykonaj teraz, np. ($x='coś') podstaw i wyświetl
$() - wykonaj teraz i potraktuj jak zmienną, np. "2+3=$(2+3)"
@() - potraktuj jako tablicę (także pustą lub 1-el.)
, - literał tablicy
& - wykonaj
. - wykonaj skrypt ps1 zapamiętując jego zmienne (spacja po kropce)
.. - zakres liczb całk. np. -5.1..1.9 -eq -5..1
${} - nazwa zmiennej z użyciem znaków niedozwolonych w nazwach, np. ${a b} (ale $ąćę jest ok)
` = \ w innych językach, choć w PowerShell RegExp jest normalnie \
konwersja z wartością domyślną - bez zgłaszania błędów:
$x = $xIn -as [double]; if ($null -eq $x) { $x = 0.0 }

PSCustomObject
$myObj=[PSCustomObject]@{Nm='K'}, $ht=[ordered]@{Nm='K'};$myObj=[pscustomobject]$ht
$myObj | ConvertTo-Json -depth 10 | Set-Content -Path $Path - zapis do pliku
$myObj=Get-Content -Path $Path | ConvertFrom-Json - odczyt z pliku
$myObj | Add-Member -MemberType NoteProperty -Name 'ID' -Value 'KMarquette'
$myObj | Add-Member @{ID='KMarquette'} (krótko, ale nie wiem, czy to to samo co powyżej)
wszystkie własności:
$myObj | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name
czy własność istnieje? (działa także przy wyższych StrictMode):
if( [bool] $myObj.psobject.Properties['ID'] )
$myObj.Nm lub $myObj.'Nm' lub $myObj.$prop - odczytaj wartość
$b=$myObj.psobject.copy() - prawdziwa kopia (a nie tylko referencja)

2: RegExp

$a -replace $b,$c to .NET Regex.Replace($a, $b, $c, RegexOptions.IgnoreCase); $a.replace($b, $c) - zwykła zamiana

3: Ustawienia

Przydatne ustawienia
Set-StrictMode -Version 3
$ErrorActionPreference = "Stop" - gdy chcemy na początku nie przeoczyć błędów
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' - inaczej UTF16 LE BOM, czyli UCS2 LE BOM - też nieźle.

4: Array

$myArray = @(); $myArray += '...' - bardzo powolne; za każdym += kopiuje całą tablicę
$myArrList = [System.Collections.ArrayList]@(); [void]$myArrList.Add() - lista dynamiczna; gdy brak [void] do drukuje liczbę elementów
$Arr.length szybko dla tablicy, $ArrList.count powolniejsze, używaj dla kolekcji.

$a=@(11,22,33,44); $a[0,2];11,33 $a[0,-1]11,44 $a[($a.Count-1)..0]wspak $b,$c=$a; $b11 $c22,33,44
[string[]]$s3=@('')*3 [string[][]]$s2x4=(,(@('x')*4))*2 $s2x4[1][3]x

$ArrayDeepCopy = $Array | foreach { $_ } # deep copy trick to spłaszcza tablicę;
dla wielowymiarowych: $MultiDimShallowCopy = $Array | foreach { , $_ } $MultiDimDeepCopy = $Array | foreach { , ($_ | foreach{ $_ }) }

$Obj | Export-Clixml -LiteralPath .\serialized.xml $ObjDeepCopy = Import-Clixml .\serialized.xml

5: Pliki

$EnDefault = [System.Text.Encoding]::Default # gdy potrzeba ANSI, np. dla txt-CSV
[Console]::OutputEncoding = [System.Text.Encoding]::Unicode
Set-Location -Path $PSScriptRoot # gdy używam ścieżek względem położenia bieżącego skryptu
            # System.IO.Stream - szybko, ale mało intuicyjnie:
$fWe = new-object System.IO.StreamReader( (Resolve-Path ('we.txt')), $EnDefault) 
                                        #  ^-- Reader: koniecznie pełna ścieżka!
  try { while (($wiersz = $fWe.ReadLine()) -ne $null) { ... } finally { $fWe.Close() }
$fWy = new-object System.IO.StreamWriter( ('..\Wyniki\' + 'wy1.txt'), $false, $EnDefault) 
                                        # ^-- konieczny nawias, gdy "+"  ^--no-append
  try { ...; $fWy.WriteLine( $kolejnyWiersz )  } finally { $fWy.Close() }

Pliki tekstowe UTF-8 z/bez BOM, ANSI

$txt = Get-Content 'a.txt' -Raw
# tzn. -Encoding Default: gdy 'a.txt' z BOM, np. UTF-8 BOM, to ma UTF ma priorytet, inaczej ANSI
# w $txt całość pliku w jednym łańcuchu (i odpowiednio np. z \r\n, czy \n)

$txt = Get-Content 'b.txt' -Raw -Encoding UTF8
# tu dobrze wczyta 'b.txt' UTF-8 bez BOM, a z BOM też będzie ok
# tak samo jak:
[System.IO.File]::ReadAllText("b.txt")

# W Powershell 5.1 jest drobny problem z zapisaniem UTF-8 bez BOM. Na szczęście działa:
[System.IO.File]::WriteAllText("b.txt", $txt)

Lista podfolderów może się przydać do katalogowania dysków z kopiami zapasowymi:

Polecenie PowerShell dla foldera bieżącego '.\', np. głównego na wybranym dysku:

Get-ChildItem -Directory '.\' | ForEach{ $_.Name+'\'; $_ | ForEach {'*  '+($_.GetDirectories().Name -join '\, ')+"\`n"}  }

Analogiczna wersja do wklejenia w pasku eksploratora plików czy menu Total Comander`a:

Powershell  -NoExit -c "Get-ChildItem -Directory '.\' | ForEach{ $_.Name+'\'; $_ | ForEach {'*  '+($_.GetDirectories().Name -join '\, ')+\"`\`n\"}  }"

Fragment przykładowego wyniku:

Users\
*  All Users\, Default\, ...

Windows\
*  Boot\, Cursors\, debug\, ...

6: Operator @

  1. @() -array , @{} -hash table
  2. @ operator rozwinięcia (splat)
    function fun1 { param([int]$x, [int]$y)
      $x + $y
    }
    fun1 10 11     #-> 21 ( NIE: fun1(10, 11); NIE: fun1 10, 11 )
    $a = @(10, 11)
    fun1 @a        #-> 21
    
  3. Here string
    $c = @"
    Wiele
    "wierszy" $a 
    "@
    

7: Właściwości mutim. plików

Odczyt rozszerzonych własności pliku

$shellFolder = $Shell.NameSpace("$($pwd.Path)\...\").self.GetFolder()
$shellFile   = $shellFolder.ParseName('abc.mp4')
$shellFile # m.in. Name ('abc.mp4'), Path, ModifyDate ('2021-04-08 19:11:27'), Size (bajty)
0..400 | where-object {($details=$shellFolder.GetDetailsOf($shellFile,$_))} | ForEach {
  " $($_.ToString('000')):$(($shellFolder.GetDetailsOf($null,$_)).PadLeft(40,'.')) : $details"
} #rozmiar np. w MB, czas bez sek.
                   # albo odczytaj wszystkie, także puste właściwości
0..400 | ForEach {
  " $($_.ToString('000')):$(($shellFolder.GetDetailsOf($null,$_)).PadLeft(40,'.')) " +
  ":  $($shellFolder.GetDetailsOf($shellFile,$_))"
}

Odczytywanie tekstów z językowych DLL.MUI, np. z c:\Windows\System32\en-US\propsys.dll.mui
1. Dodaj na końcu rozszerzenie .DLL; 2. Otwórz w Visual Studio; 3. Zapisz jako .RC

8: Odczyt rejestru Windows

Zob. przykłady: WinInst_error_migrate_data
m.in. infProfileList_regWrTm.ps1 (html) (.zip)

.

9: Zarządzanie aplikacjami - CLI

  • Lista zainstalowanych
Get-AppxPackage -AllUsers
  • Odinstalowanie - dla podanego fragmentu nazwy (ostrożnie!).
foreach ($a in @("*Phone*","*zunemusic*")) {Get-AppxPackage -AllUsers Microsoft.$a | Remove-AppxPackage -AllUsers}
  • Pełna lista aplikacji
$regPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'

Get-ItemProperty -Path $regPath | Where-Object { $_.DisplayName -ne $null } |
  Format-Table -Property DisplayName, InstallDate, DisplayVersion, InstallLocation -AutoSize -Wrap |
  Out-File -Width 500 a500.txt
  • winget

    • winget upgrade --all - lista aplikacji wymagających aktualizacji i ewentualnie zbiorcza aktualizacja po akceptacji.
    • winget search veea - szuka aplikacji zawierającej veea w Internecie
    • winget list vee - wyszukuje aplikację lokalnie na PC
       Name                               Id                Version    Available   Source
       ---------------------------------  ----------------  ---------  ----------  ------
       Veeam Agent for Microsoft Windows  Veeam.VeeamAgent  6.3.0.177  6.3.1.1074  winget
      
    • winget download Veeam.VeeamAgent - zapisuje pliki instalacyjne i licencję do foldera Download/<app>/ (trzeba podać pełne Id jako parametr)

 

Różne odnośniki:


 

# Nie będziesz używał!

... | foreach { ... continue break
$a[0 . .-1]


.