powershell

Powershell Stringverwendung

Written by  on April 10, 2017

Ein Script verhält sich anders auf Windows 2008 und Windows 2012? Scheinbar hat sich die Stringverarbeitung leicht verändert. Wo unter 2012 eine Variable aufgelöst wird, passiert das unter 2008 nicht:

Windows 2008 R2

$A="IchBinEineVariable"

echo "-p$A"
-pIchBinEineVariable

echo -p"$A"
-p"$A"

echo -p$A
-p$A

Windows 2012 R2

$A="IchBinEineVariable"

echo "-p$A"
-pIchBinEineVariable

echo -p"$A"
-pIchBinEineVariable

echo -p$A
-p$A

Powershell 32 Bit vs. 64 Bit

Written by  on März 21, 2017

Wenn einem Certutil.exe bei manchen Parametern mitteilt, dass manche Klassen nicht geladen werden könne, ist möglicherweise die 32 Bit vs. 64 Bit Problematik daran schuld.

C:\windows\System32\certutil.exe -view -restrict "Issued Common Name=<CN>, Disposition=20" -out "RequestID,RequesterName"  -config "<CAHostName>\<CAName>"
CertUtil: -view command FAILED: 0x80040154 (-2147221164)
CertUtil: Class not registered

Wie tritt das auf, wenn ich doch ein 64 Bit Betriebssystem habe? Und wie stelle ich fest, was ich für eine PowerShell am laufen habe?
Eine „normale“ PowerShell:

> [Environment]::Is64BitProcess
True

Die „gleiche“ PowerShell geöffnet in MobaXterm:

> [Environment]::Is64BitProcess
False

Erst Version 10 von MobaXterm soll das Problem beheben und auf 64 Bit Systemen die korrekte PowerShell öffnen.

Interessantes Detail am Rande, eine 64 Bit PowerShell liegt unter C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe ide 32 Bit Version ist zu finden unter C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe!

Empty Array in Powershell

Written by  on September 30, 2016

Ein leeres Array braucht man z.B. damit eine Schleife die auf das Array zugreift gar nicht erst durchläuft.

Initialisiert wird es mit

$array = @()

Ein Array allgemein definieren

$array="wert1","wert2","wert3"

Die Schleife dazu sieht so aus

foreach ($element in $array)
{
  print ("$element");
}

Windows und die Bash

Written by  on August 27, 2016

Spannende Zeiten! Microsoft gibt die Powershell frei für Linux. Und gleichzeitig gibt’s die Bash unter Windows 10.
Wie kommt man zur Shell? Die Installation geht recht einfach laut Anleitung.
Man braucht zumindest Windows 10 Anniversary Update build 14316, das prüft man am einfachsten mit „winver.exe“
Dann aktiviert man den Entwicklermodus. Einfach Windows Taste -> „Entwicklerfunktionen verwenden“
Als nächstes „Windows Features aktivieren oder deaktivieren“ und „Windows Subsystem for Linux (beta)“ wählen. Neustarten. Installation abschließen, indem der Befehl „bash“ ausgeführt wird.

Powershell Variablen schützen

Written by  on Juli 17, 2016

Weiß jemand, wann sich das Verhalten von Powershell verändert hat? Ich habe in ein paar älteren Scripten Abschnitte ähnlich wie

$X="blabla"
write-output "$X"

Hängt man im Output jetzt einen Doppelpunkt an, passiert auf Windows 2012 R2:

write-output "$X:"
In Zeile:1 Zeichen:15
+ write-output "$X:"
+               ~~~
Ungültiger Variablenverweis. Nach ":" folgte kein Zeichen, das für einen Variablennamen gültig ist. Verwenden Sie ggf.
"${}", um den Namen zu begrenzen.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive

Die Lösung ist einfach:

write-output "${X}:"

Aber warum sich das Verhalten auf einmal ändert ist unklar.

Powershell Switch

Written by  on Juli 16, 2016

Wie geht ein select-case auf der Powershell?

switch ($(hostname))
{
  hosta
  {
    [string]$Config="hostA.example.com"
  }
  hostb
  {
	[string]$Config="hostB.example.com"
  }
  default
  {
    write-output "Script not configured for $(hostname)!"
	exit 1
  }
}

write-output $Config

Von Batch zu PowerShell

Written by  on Juli 12, 2016

Ein guter Grund Scripte zu migrieren könnte sein, dass viele Konstrukte einfacher und lesbarer geworden sind.

Es ist eher schwierig auf einen Blick genau zu sagen, was hier für Dateinamen erzeugt werden. Weil scheinbar Strings an festen Positionen zerschnitten werden. Das könnte ausserdem Probleme geben, wenn verschiedene Sprachversionen zum Einsatz kommen:

"%PATH%\%DATE%_%HOUR: =0%.%TIME:~3,2%.%TIME:~6,2%.zip"

Eleganter auf der Powershell

"$PATH\$(get-date -format dd.mm.yyyy_HH.mm.ss).zip"

Zwei Mal Powershell

Written by  on November 20, 2015

Einfache Übung – den Inhalt einer Datei am Bildschirm ausgeben.
Dazu eine Datei test.txt

das ist ein test
zeile 2

Und jetzt mal probieren, ein paar einfache Befehle auf der Shell einzugeben:

PS C:\tmp> $Input= get-content .\test.txt
PS C:\tmp> foreach ($line in $Input){
>>> write-output $line
>>> }
PS C:\tmp>

Seltsam, es kommt überhaupt kein Output raus? Was habe ich nur falsch gemacht? In dem Script vorhin hat das doch exakt genau so ausgeschaut!
Also ein Script daraus erstellen test.ps1

$Input= get-content .\test.txt
foreach ($line in $Input){
write-output $line
}

Und ausführen:

PS C:\tmp> .\test.ps1
das ist ein test
zeile 2

Schön – wer könnte auch erwarten, dass eine Shell zwei Mal das gleiche tun kann, mit exakt dem gleichen Input?

Powershell

Written by  on Juli 27, 2015

Microsoft macht einem das Scripten mit Powershell schon mal ziemlich schwer:

PS C:\tmp> .\test.ps1
Die Datei "C:\tmp\test.ps1" kann nicht geladen werden, da die Ausführung von Sk
ripts auf diesem System deaktiviert ist. Weitere Informationen erhalten Sie mit
 "get-help about_signing".
Bei Zeile:1 Zeichen:11
+ .\test.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

So soll man das Ausführen von Scripten erlauben können:

Set-ExecutionPolicy Unrestricted<pre>

Das hilft aber auch nicht immer:
<pre>
Set-ExecutionPolicy : Der Zugriff auf den Registrierungsschlüssel "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\Shel
lIds\Microsoft.PowerShell" wurde verweigert.
Bei Zeile:1 Zeichen:20
+ Set-ExecutionPolicy <<<<  Unrestricted
    + CategoryInfo          : NotSpecified: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

Um das zu lösen, müssen wir den Registrierungseditor bemühen:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"ExecutionPolicy"="Unrestricted"

Update: Quelle

Grep Dingsda

Written by  on Juni 23, 2015

Aufgabe: Beschreiben Sie Grep wie bei Dingsda… ohne das Wort Grep zu benutzen

Lösung: Microsoft Windows Powershell