Private/Wissen/B_Basic/B20_Konvertierung.ps1

<#
 
# Konvertierung
 
Aus einer Objekt-Welt in eine andere Objekt-Welt zu konvertieren.
 
- **Hashtags** Konvertierung convert string hex csv xml json markdown md datetime int SecureString data sddl html decimal secure
 
- **Version** 2020.05.29
 
#>


# READ Weiterführende und Nachschlage-Informationen:
Get-Command -Verb 'ConvertFrom' -Module 'Microsoft.PowerShell.*'

#region String (Text) nach DateTime, Int32, Decimal, etc.

[datetime]'2020-05-29'
[int]'123'
# usw...

# ! oder:

$OSCulture = Get-Culture
$OSCulture = New-Object 'System.Globalization.CultureInfo' -ArgumentList 'en-us'
$OSCulture.DisplayName
$OSCulture.DateTimeFormat
$OSCulture.NumberFormat
$Benutzereingabe = Read-Host -Prompt "Bitte Text eingeben (Kultur: $($OSCulture.DisplayName) z.B. Datum $($OSCulture.DateTimeFormat.ShortDatePattern))"

$benutzereingabe.ToInt32($OSCulture)
$benutzereingabe.ToDecimal($OSCulture)
$benutzereingabe.ToDateTime($OSCulture)
# ... usw.

# ! oder:

$Benutzereingabe = '20201011'
[DateTime]::ParseExact($Benutzereingabe, 'yyyyMMdd', $null)
[Int64]::Parse('13456677')
# usw...

# ! oder:

[Convert]::ToDateTime('29.5.2020')
[Convert]::ToDateTime('29.5.2020', (Get-Culture))
# usw...

#endregion

#region Hexedezimal

0xFF

# oder:

'{0:X}' -f 255

# oder:

[Convert]::ToByte(0xFF)

# oder:

255 | Format-Hex
"Hallo Welt" | Format-Hex

# ! POWERSHELL 7 - Für die hexadezimale Darstellung von unterschiedlichen Pipeline-Objekten wurde Format-Hex verbessert:

123, "Hallo Würzburg!", (Get-Item "C:\Windows\win.ini") | Format-Hex -Encoding unicode

#endregion

#region ConvertTo-Csv - PowerShell Objekte zu CSV konvertieren

Get-Process | Select-Object 'Name', 'Company', 'WorkingSet64' | ConvertTo-Csv -Delimiter ';' -NoTypeInformation | Set-Content 'C:\temp\Processes.csv'
Start-Process -FilePath 'C:\temp\Processes.csv' -Wait

#endregion

#region ConvertTo-Html - PowerShell Objekte zu HTML konvertieren

@'
html * { font-size: 11; font-family: Consolas; }
th { color: #0033cc; }
'@
 | Out-File -FilePath 'C:\temp\core.css'

Get-Service | Select-Object -Property 'DisplayName', 'Status', 'StartType', 'Name' | Sort-Object -Property 'Status', 'StartType', 'DisplayName' | ConvertTo-Html -Body '<p>Sortierte Übersicht aller registrierten Dienste.</p>' -Head "<h1>Service-Übersicht von $env:COMPUTERNAME</h1>" -As 'Table' -PreContent "<p>Sortiert nach: Status, StartType, DisplayName</p>" -PostContent "<p><strong>Stand:</strong> $(Get-Date -Format 'dddd, d. MMMM yyyy')</p>" -CssUri 'C:\temp\core.css' | Out-File -FilePath 'C:\Temp\ServiceOverview.html'
Start-Process -FilePath 'C:\Temp\ServiceOverview.html' #-Wait

#endregion

#region ConvertTo-Xml - PowerShell-Objekte von/nach XML konvertieren

# ! Einen String in XML konvertieren:

$exchange = [xml]@"
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
        <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
        <Cube time="2020-05-22">
            <Cube currency="USD" rate="1.0904"/>
            <Cube currency="JPY" rate="117.26"/>
            <Cube currency="BGN" rate="1.9558"/>
        </Cube>
        <Cube time="2020-05-21">
            <Cube currency="USD" rate="1.1"/>
            <Cube currency="JPY" rate="118.42"/>
            <Cube currency="BGN" rate="1.9558"/>
        </Cube>
    </Cube>
</gesmes:Envelope>
"@

$exchange.Envelope.Cube.Cube

$exchange.Envelope.Cube.Cube | Where-Object -Property 'time' -eq -Value '2020-05-21' | Select-Object -ExpandProperty 'Cube' | Where-Object -Property 'currency' -eq -Value 'USD' | Select-Object -ExpandProperty 'rate'

# ! PowerShell-Objekte nach XML konvertieren:

Get-Service -Name 'Win*' | ConvertTo-Xml -Depth 1 -As 'String'

#endregion

#region Convert*-SecureString - Text ver-/entschlüsseln

Read-Host -Prompt 'Passwort eingeben' -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath 'C:\temp\SecureString.txt' -Force
Get-Content -Path 'C:\Temp\SecureString.txt' | ConvertTo-SecureString

#endregion

#region *-Json - Von und nach json konvertieren

# ! String nach Json-Objekt konvertieren:

$json = Join-Path -Path $env:APPDATA -ChildPath '\Code\User\settings.json' | Get-Item | Get-Content | ConvertFrom-Json
$json.'files.autoSave'

# ! PowerShell-Objekte nach json konvertieren:

Get-Service -Name 'Win*' | ConvertTo-Json -Depth 1

# ! Test-Json - Schema-Validierung (Seit PowerShell 7):

$schema = @'
{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "title": "The Root Schema",
  "required": [
    "name",
    "age"
  ],
  "properties": {
    "name": {
      "$id": "#/properties/name",
      "type": "string",
      "title": "The Name Schema",
      "default": "",
      "examples": [
        "Ashley"
      ],
      "pattern": "^(.*)$"
    },
    "age": {
      "$id": "#/properties/age",
      "type": "integer",
      "title": "The Age Schema",
      "default": 0,
      "examples": [
        25
      ]
    }
  }
}
'@

"{'name': 'Ashley', 'age': '25'}" | Test-Json -Schema $schema

#endregion

#region ConvertFrom-SddlString - Berechtigungen (ACL) auswerten

Get-Acl -Path $env:USERPROFILE | Select-Object -ExpandProperty 'Sddl' | ConvertFrom-SddlString

#endregion

#region ConvertFrom-Csv - CSV-Daten zu PowerShell Objekte konvertieren

# ? Beispiel:

@'
Benutzername;Passwort;Beschreibung
p.lustig;P@ssw0rd;Peter Lustig (IT)
e.gruen;Geh1imAbc;Eva Grün (HR)
'@
 | ConvertFrom-Csv -Delimiter ';' -Header 'Name', 'Password', 'Description' | Select-Object -Skip 1

# ? Beispiel:

$ports = @"
20,FTP
21,FTP
22,SSH
23,TelNet
25,Smtp
135,RPC
137,NetBIOS-Namensauflösung
138,NetBIOS-Namensauflösung
139,NetBIOS-Namensauflösung
161,SNMP
162,SNMP
445,SMB Freigabe+ADS+CIM/WMI
464,Kerberos Change/SetPassword
5985,PowerShellRemoting (HTTP)
5986,PowerShellRemoting (HTTPS)
"@
 | ConvertFrom-Csv -Header 'Port', 'Function'
$ports

#endregion

#region ConvertFrom-String - Texte zu String-Daten konvertieren

'Hallo Welt' | ConvertFrom-String
'Hallo Welt' | ConvertFrom-String -Delimiter 'll'
'Hallo Welt' | ConvertFrom-String -PropertyNames 'FirstWord', 'SecondWord'

'Lee Holmes', 'Steve Lee', 'Jeffrey Schmitt' | Convert-String -Example 'Bill Gates=Gates, B.', 'John Smith=Smith, J.'

# Komplexe Variante:

$template = @'
{[string]ProtocolName*:ip} {[int]AssignedNumber:0} {[string]Aliase:IP} # {[string]Comment:Internet protocol}
{[string]ProtocolName*:xns-idp} {[int]AssignedNumber:22} {[string]Aliase:XNS-IDP} # {[string]Comment:Xerox NS IDP}
{[string]ProtocolName*:rdp} {[int]AssignedNumber:27} {[string]Aliase:RDP} # {[string]Comment:'reliable datagram' protocol}
{[string]ProtocolName*:ipv6} {[int]AssignedNumber:41} {[string]Aliase:IPv6} # {[string]Comment:Internet protocol IPv6}
'@


$result = Get-Content 'C:\Windows\System32\drivers\etc\protocol' | Select-String -Pattern '^[^#]' | ConvertFrom-String -TemplateContent $template
$result | Get-Member
$result.AssignedNumber
$result.Aliase


#endregion

#region ConvertFrom-StringData - Text-Datenobjekte u.a. für Mehrsprachigkeit

# ? 'Mehrsprachige' Texte ausgeben:

Data LocalizedData {
  ConvertFrom-StringData @'
  AllesOkMeldung = Alles ist OK!
  NichtsOkMeldung = Nichts ist OK!
'@

}
$LocalizedData.AllesOkMeldung
$LocalizedData.NichtsOkMeldung

#endregion

#region ConvertFrom-Markdown - Mit Markdown (.MD) Daten umgehen

# ! Erst ab PowerShell 7

$md = @'
# Überschrift 1
 
## Überschrift 1.2
 
Markdown ist eine vereinfachte **Auszeichnungssprache**. Ein Ziel von Markdown ist, dass schon die *Ausgangsform* ohne weitere Konvertierung **leicht lesbar** ist.
 
- [ ] Aufgabe 1
- [X] Aufgabe 2
- [ ] Aufgabe 3
 
```powershell
Get-Command -Noun 'markdown' -Module 'Microsoft.PowerShell.Utility'
```
'@
 
$md | ConvertFrom-Markdown -AsVT100EncodedString | Select-Object -ExpandProperty 'VT100EncodedString'
$md | ConvertFrom-Markdown  | Select-Object -ExpandProperty 'Html'
$md | ConvertFrom-Markdown | Show-Markdown -UseBrowser
$md | ConvertFrom-Markdown -AsVT100EncodedString | Show-Markdown

Import-Module '.\AKPT'
Find-Know -AsMarkdownContent | Show-Markdown -UseBrowser

#endregion

# TODO QUIZ - https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAa__Yp1xwFUN09INTY1RzRWMDlHVk0xQjMxSzBQTTlLNS4u