windelterrorist
Goto Top

Do-While Schleife mit test-path

Sry, dass ich euch nochmals stören muss...

Brauche Hilfe bei einer Do-While Schleife... Es soll erst nach $destination abgefragt werden, wenn der Quellpfad genau definiert wurde
(mit überprüfung, dass der Sourcepfad auch wirklich existiert, falls dieser nicht existiert, erneut abfragen... wenn der Sourcepfad auch wirklich exisitiert soll der Loop verlassen werden)


Mein Code:

...

$source = read-host "Bitte geben sie den Sourcepfad ein"
Do {
If (Test-path $source) {
$destination = read-host "Bitte geben sie den Zielpfad ein (Am Ende des Pfades keinen \ )"
}

else {
echo "Dieser Pfad existiert nicht, bitte prüfen Sie ihre Eingabe!"
}
}

While (bedingung)

...

Nun fehlt eigentlich nur noch die While (bedingung)...


Danke schonmal im Voraus.

Gruss
windelterrorist

Content-ID: 291476

Url: https://administrator.de/forum/do-while-schleife-mit-test-path-291476.html

Ausgedruckt am: 23.12.2024 um 20:12 Uhr

114757
Lösung 114757 21.12.2015, aktualisiert am 22.12.2015 um 10:27:15 Uhr
Goto Top
Do {
    $source = Read-Host "Quellpfad angeben"  
    if (!(Test-Path $source)){write-host "Pfad existiert nicht" -ForegroundColor Yellow}  
}until(Test-Path $source)

Do {
    $destination= Read-Host "Zielpfad angeben"  
    if (!(Test-Path $destination)){write-host "Pfad existiert nicht" -ForegroundColor Yellow}  
}until(Test-Path $destination)
windelterrorist
windelterrorist 21.12.2015 aktualisiert um 19:11:45 Uhr
Goto Top
Hi jodel32

Habs mir fast noch gedacht man muss das ganze mit 2 Schleifen machen... kann es erst Morgen testen, aber sollte ja eigentlich prima funktionieren...

Danke dir!

Grüsse
114757
114757 21.12.2015 aktualisiert um 19:04:41 Uhr
Goto Top
Zitat von @windelterrorist:
Habs mir fast noch gedacht man muss das ganze mit 2 Achleifwn machen...
Müssen tut man das nicht, kann man auch kombinieren macht das ganze aber etwas unübersichtllicher
windelterrorist
windelterrorist 22.12.2015 um 10:29:22 Uhr
Goto Top
Hat funktioniert, genau so, wie ich mir das vorstellte... bin gerade dabei das ganze zu versuchen in eine Schlaufe zu packen.... einfach aus Eigeninteresse face-smile

Vielen Dank jodel32 !
windelterrorist
windelterrorist 22.12.2015 um 15:49:25 Uhr
Goto Top
@114757

Als ich nun weitere Parte meines Skriptes testete, ist mir aufgefallen, dass es noch einen kleinen Makel gibt bei der einen Schlaufe hat...

Und zwar bei der Do-While Schleife mit dem $destination... wenn man zum Beispiel als Zielpfad "E:\test\kopieren" angibt, dann wäre es doch toll wenn er diesen auch erstellen würde (wenns z.B. erst E:\test gibt), anstatt die Meldung "Pfad existiert nicht" auszugeben...

Beim Sourcepfad muss dieser natürlich existieren, da stimmts parfait, aber der Zielfpfad könnte ja erstellt werden, wenn dieser noch nicht vorhanden ist... Trotzdem sollten aber Eingaben wie "E\:" (fehlerhaft) oder wie "D:\" (wenns das Laufwerk D: nicht gibt), verhindert werden...


Gruss
windelterrorist
114757
Lösung 114757 22.12.2015, aktualisiert am 06.01.2016 um 13:38:05 Uhr
Goto Top
Zitat von @windelterrorist:
Und zwar bei der Do-While Schleife mit dem $destination... wenn man zum Beispiel als Zielpfad "E:\test\kopieren" angibt, dann wäre es doch toll wenn er diesen auch erstellen würde (
Wo ist das Problem ????
md 'e:\test\kopieren'
Fehler kannst du problemlos auch mit Try...Catch Konstrukten abfangen
try{
    md 'e:\test\kopieren'  
}catch{
   write-host $_.Exception.Message -F Red
}
Les die einfach mal die Grundlagen zum Errorhandling mit Powershell durch
http://blogs.msdn.com/b/kebab/archive/2013/06/09/an-introduction-to-err ...
dann sollte es auch bei dir Klick machen.
windelterrorist
windelterrorist 05.01.2016 aktualisiert um 09:21:34 Uhr
Goto Top
Hi jodel32

Also... tut mir leid, dass ich dir erst jetzt antworten konnte...
Vielen Dank für deine Bemühung!

Die try, catch Methode hat grundsätzlich mein Problem gelöst... aber in beiden Abfragen (Source- und Destinationpfad) tritt bei einer leeren Eingabe ("") folgendes auf:

Test-Path : Cannot bind argument to parameter 'Path' because it is an empty string.

back-to-topif (!(Test-Path $source)){

back-to-top~~~~~~~~~~~~

+ CategoryInfo : InvalidData: (face-smile [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand


Ich versuchte es so zu lösen, jedoch erfolglos:

Do {
$source = Read-Host "Bitte geben Sie den Quellpfad an"
if (($source = "") -or !(Test-Path $source)){
write-host "Pfad existiert nicht" -ForegroundColor Yellow
}

}until(Test-Path $source)


Frohes Neus!
114757
114757 05.01.2016, aktualisiert am 06.01.2016 um 11:36:43 Uhr
Goto Top
einfach vorher mit einer if auf einen leeren String prüfen, oder das ganze mit regex abfackeln, bleibt dir überlassen ...
windelterrorist
windelterrorist 06.01.2016 aktualisiert um 10:58:45 Uhr
Goto Top
finde es aber komisch, dass es so nicht funktioniert:

Do {
$source = Read-Host "Bitte geben Sie den Quellpfad an"

if (($source -eq $null) -or !(Test-Path $source)){
write-host "Pfad existiert nicht" -ForegroundColor Yellow
}

}until(Test-Path $source)


Was ist denn da falsch? Oder was mache ich falsch? Nach einer leeren Eingabe spuckt er immer den selben Fehler aus...

Test-Path : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es sich um eine leere Zeichenfolge handelt.
114757
Lösung 114757 06.01.2016 aktualisiert um 13:46:21 Uhr
Goto Top
Was ist denn da falsch?
Die Variable ist immer noch ein Object und nicht $null sondern ein leerer String, kannst du dir auch ganz einfach anzeigen lassen mit $source.getType()
($source -eq "")  
Powershell Debugging erste Unterichtsstunde ...

Und außerdem sollte die Prüfung auf leeren String nicht in der gleichen IF-Abfrage stattfinden da immer beide Ausdrücke ausgewertet werden.

Kannst du dir auch als mehrfach verwendbare Funktion kapseln
function Get-ValidPath($query){
    While($true){
        $input = Read-Host $query
        if($input -ne ""){  
            if (Test-Path $input){
                return $input
            }else{
                write-host "Pfad existiert nicht! Eingabe wiederholen" -ForegroundColor Yellow  
            }
        }else{
            write-host "Sie haben keine Eingabe getätigt! Eingabe wiederholen." -ForegroundColor Yellow  
        }
     }
 }
 
 cls
 $path = Get-ValidPath "Quellpfad eingeben"  
 $path
windelterrorist
windelterrorist 06.01.2016 aktualisiert um 13:53:23 Uhr
Goto Top
Nun ist mir schon einiges klarer...

Ich denke nun muss ich dich nicht mehr weiter belästigen... was Pfade überprüfen angeht... ;)

Vielen herzlichen Dank!
windelterrorist
windelterrorist 12.01.2016 aktualisiert um 09:15:53 Uhr
Goto Top
Oder doch nochmals...

Für eine Destinationpath abfrage habe ich so meine Vorstellungen, kann sie aber selbst nicht wirklich umsetzen. Grundsätzlich ist der Aufbau ja ähnlich, wie beim Sourcepfad.

- Leere Eingabe verhindern und erneut abfragen
- Wenn kein "Laufwerksbuchstaben" (z.B. (C:\ oder D:\ ...)) am Anfang der Eingabe steht, oder der Laufwerksbuchstabe nicht existiert (z.B. Y:\ dabei gibt es diesen nicht), dann ebenfalls verhindern und erneut abfragen
- Wenn ein gültger Laufwerksbuchstaben eingegeben wurde, dann soll die folgende Struktur erstellt werden, z.B. :
Eingabe: C:\abcd , so wird der Ordner "abcd" im "C:\" Laufwerk erstellt

Mit @114757 's Hilfe konnte ich diese Grundstruktur erstellen:


function Get-ValidPath($querydest){
While($true){
$input = Read-Host $querydest
if($input -ne ""){
if (Test-Path $input){
return $input
}

else{

try{
md "$input"
}

catch{
#return $input
write-host $_.Exception.Message -F Red}
}
}

else{
write-host "Sie haben keine Eingabe getätigt! Eingabe wiederholen." -ForegroundColor Yellow}
}
}

cls
$destpath = Get-ValidPath "Zielpfad eingeben"
$destpath


Das Problem wäre jetzt einfach noch, dass er die Laufwerksbuchstaben erkennen soll und überprüfen, ob diese existieren.