deiferl
Goto Top

POWERSHELL mehrere Programme aus .txt lesen und ausführen

Hallo,

bin neu in der wunderbaren Welt der Powershell und stehe vor meinem ersten Problem:

Es sollen in einer .txt hinterlegte Programme zu Testzwecken gestartet werden.Zu erst habe ich eine .txt angelegt, in welcher die betreffenden .exe und Programmpfade genannt sind.
zB.:
C:\programme\Adobe\Reader 9.0\Reader\AcroRd32.exe
C:\programme\Microsoft Office\Office12\WINWORD.EXE
C:\programme\SAP\SapSetup\setup\SAL\SapLogon.s8l

Mit folgenden Zeilen erstelle ich nun eine Vergleichsliste in einer .ps1

# Programme starten
Switch -file "h:\pss\ps1\SWListCompared.txt" {
default {Invoke-Item $_}
}


Mit switch lese ich den Inhalt der Datei zeilenweise ein und übergebe die Zeilen jeweils an invoke-item um das Programm zu starten (soweit die Idee)
Die Programme werden auch gestartet, also die Funktion wäre prinzipiell gegeben. Dabei bekomme ich aber immer Fehlermeldungen:

Invoke-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es sich um eine leere Zeichenfolge handelt.
Bei H:\pss\ps1\Run-SWList2.ps1:31 Zeichen:25

back-to-topdefault {Invoke-Item <<<< $_}

back-to-topCategoryInfo : InvalidData: ( : ) [Invoke-Item], ParameterBindingValidationException

back-to-topFullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeItemCommand"



Das Problem scheint also die Pfadangabe der Variablen $_ für invoke-item zu sein, ohne Pfadangabe kann ich aber nicht direkt an invoke-item übergeben.
Selbes Problem habe ich auch mit einer foreach-Schleife und Übergabe an invoke-item.
Ich denke, ich habe hier einen groben Verständnisfehler, komme aber nicht darauf und bitte euch um tatkräftige Unterstützung.

Content-Key: 171260

Url: https://administrator.de/contentid/171260

Printed on: April 19, 2024 at 09:04 o'clock

Member: Logan000
Logan000 Aug 10, 2011 at 11:31:03 (UTC)
Goto Top
Moin moin

Die gute Nachricht zuerst: Wie du schon vermutet hast ...
also die Funktion wäre prinzipiell gegeben.
liegt der "Fehler" nicht in deinem Skript. Das funktioniert genau so wie du es programmiert hast.

Invoke ist hier nicht das Problem. Das rennt los und führt aus.
Es mosert nur rum wenn der Pfad nicht existiert oder, wie in deinem Fall, keiner angegeben wird.

Das Switch macht auch nur seinen Job und liest deine SWListCompared.txt zeilenweise aus.
Aber wer immer diese SWListCompared.txt erstellt hat, sollte dafür sorgen das sie keine leeren Zeilen enthält.
Oder Du prüfst in deinem Skript, vor dem invoke ab, ob da villeicht ein leerer Parameter im Anflug ist.

Gruß L.
Member: deiferl
deiferl Aug 10, 2011 at 13:49:47 (UTC)
Goto Top
Moin,

Danke für den Tip (eigentlich weisst einen der Fehler ja drauf hin face-wink ) Und tatsächlich.
Die SWList.txt ist das Ergebnis eines compare.

$strCompared = Compare $strReference $strDifference -includeEqual -excludeDifferent
$strCompared | ft InputObject -hidetableheaders -auto | out-file -filepath "h:\pss\ps1\SWListCompared.txt"

Da wird am Anfang eine Leerzeile geschrieben und am Ende nochmals zwei. In den zu vergleichenden Dateien gibts die aber nicht. Wie kann ich die denn entfernen? Irgendwie steh ich jetzt aufm Schlauch.

Nochmals, Büdde, ein kleiner Schubs. Danke.
Member: deiferl
deiferl Aug 10, 2011 at 14:48:32 (UTC)
Goto Top
Manchmal sieht man den Wald vor Bäumen nicht. Ich denke kurz und gut ist folgendes:

  1. Programme starten
Switch -file "h:\pss\ps1\SWListCompared.txt" {
default {if ($_ -ne "") {
Invoke-Item $_}}
}

Damit gebe ich die Zeilen ohne Inhalt nicht an invoke-item weiter!
Thanks for "Schubs". So funktioniert es ohne Fehler.