SeroSoft 10 Geschrieben 4. April 2010 Melden Teilen Geschrieben 4. April 2010 (bearbeitet) Hallo zusammen, ich habe einen Path Bsp.: D:\ebene1\ebene2\ebene3\ Momentan schreib ich rekursiv alle Dateien die in eine txt rein die sich in dem Path befinden. Kann z.B. so aussehen: D:\ebene1\ebene2\ebene3\datei.txt D:\ebene1\ebene2\ebene3\1\datei.txt D:\ebene1\ebene2\ebene3\2\datei.txt D:\ebene1\ebene2\ebene3\3\img\datei.jpg Jetzt möchte ich immer ab ebene3 den Path einbinden: Bsp.: \ebene3\datei.txt \ebene3\1\datei.txt \ebene3\2\datei.txt \ebene3\3\img\datei.jpg Wie beschneide ich den Path unabhängig wo das Ganze liegt? Wenn z.B. eben2 wegfällt... D:\ebene1\ebene3\2\datei.txt Ich möchte das Script gerne dynamisch haben das ich das hinkopieren kann ohne einen Path zum Beschneiden von Hand eintragen zu müssen. MfG bearbeitet 4. April 2010 von SeroSoft Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 4. April 2010 Melden Teilen Geschrieben 4. April 2010 Hallo Sero, $p='D:\ebene1\ebene2\ebene3\datei.txt' $array=$p -split "\\",3 $array[2] get-help about_split cu blub Zitieren Link zu diesem Kommentar
SeroSoft 10 Geschrieben 4. April 2010 Autor Melden Teilen Geschrieben 4. April 2010 Hi, das ist aber nicht dynamisch! Alles ab ebene3 bleibt. Alles was weiter oben ist kann sich ändern. MfG Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 4. April 2010 Melden Teilen Geschrieben 4. April 2010 sorry, ich verstehs dann noch nicht. Kannst du vielleicht den Split Befehl auf ein Beispiel anwenden und das Ergebnis schreiben, das rauskommt und das rauskommen sollte. Evtl. liefert $array(-3) das, was du möchtest cu blub Zitieren Link zu diesem Kommentar
SeroSoft 10 Geschrieben 4. April 2010 Autor Melden Teilen Geschrieben 4. April 2010 Ok anders formulieren... ebene3 als ordnername sehen und nicht als feste Ebene! Ich versuche es anhand eines anderen Beispiels: D:\folder1\folder2\folder3 Jetzt möchte ich immer folder3 egal wo der abgelegt ist ausgeben. D.h. wenn jetzt die stuktur so aussieht: D:\folder1\folder3 Dann muss die Ausgabe trotzdem noch ab folder3 anzeigen. Bei deinem Beispiel ist es fix und würde in dem Fall einen Fehler bringen da folder3 nicht mehr an ebene3 ist. Ich möchte aber, dass das ganze funktioniert egal an welcher Stelle das Ganze liegt. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 4. April 2010 Melden Teilen Geschrieben 4. April 2010 Hi, reicht es denn dann nicht, einfach mit relativen Pfaden zu operieren? Also ab dem Pfad, der sich ändert, mittels .\ebene3\... arbeiten? Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 4. April 2010 Melden Teilen Geschrieben 4. April 2010 ok, neuer Versuch $p='D:\ebene1\ebene2\ebene3\ebene4\datei.txt' $splitoperator = "ebene3" $array=$p -split $splitoperator $array[-1] Zitieren Link zu diesem Kommentar
SeroSoft 10 Geschrieben 4. April 2010 Autor Melden Teilen Geschrieben 4. April 2010 (bearbeitet) @Blub Der Ansatz ist genau das was ich brauche. Nur wie bekomm ich das in meinem Einzeiler unter? gci "..\_TEMPC" -recurse | where-object {$_.Mode -ne "d----"} | foreach { "Source: " + $_.fullname + "; DestDir: ""{app}" + $_.fullname.split("_TEMPC")[-1] + """" } | Add-Content "..\_TEMP\export.txt" So funktioniert das nur teilweise. Der nimmt mir jetzt diverse Zeichen aus dem String und fäng wo anders an. Aus: G:\folder1\_TEMPC\FAQ_Main.txt wird: Source: G:\folder1\_TEMPC\FAQ_Main.txt; DestDir: "{app}ain.txt" und es sollte heißen: Source: G:\folder1\_TEMPC\FAQ_Main.txt; DestDir: "{app}\FAQ_Main.txt" Das ist mir jetzt aber am liebsten :-) Selbst ne Lösung gefunden! LÖSUNG: gci "..\_TEMPC" -recurse | where-object {$_.Mode -ne "d----"} | foreach { "Source: " + $_.fullname + "; DestDir: ""{app}" + [color="Red"]$_.fullname.substring($_.fullname.indexof("_TEMPC",0)+6)[/color] + """" } | Add-Content "..\_TEMP\export.txt" MfG bearbeitet 4. April 2010 von SeroSoft Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 5. April 2010 Melden Teilen Geschrieben 5. April 2010 (bearbeitet) Hallo, 2 Anmerkungen zu deiner Lösung, wenn du gestattest: ab einer gewissen Länge werden Einzeiler doch unübersichtlich. Hast du schonmal Funktionen angesehen? get-help about_functions Um Ordner bzw. Files zu filtern, ist die Property "PsIscontainer" m.W. üblicher: where-object {$_.PsIsContainer -ne $true} cu blub bearbeitet 5. April 2010 von blub Zitieren Link zu diesem Kommentar
SeroSoft 10 Geschrieben 5. April 2010 Autor Melden Teilen Geschrieben 5. April 2010 Ich muss gestehen ich hab es nur mit einem Einzeiler hinbekommen. Bei Mehrzeilern gab es am Anfang probleme mit Zeilenumbrüchen, dann habe ich alles in einem Einzeler gemacht. Ich nehme gerne jede Hilfe entgegen um das in einem Mehrzeiler umzusetzen. Ich bin persönlich kein großer Freund von den Pipegeschichten. MfG Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 5. April 2010 Melden Teilen Geschrieben 5. April 2010 Um Ordner bzw. Files zu filtern, ist die Property "PsIscontainer" m.W. üblicher: where-object {$_.PsIsContainer -ne $true} lt. "Mastering Powershell" von Tobias Weltner sei wohl where-object {$_ -is [system.IO.FileInfo]} (nur Files) bzw. where-object {$_ -is [system.IO.DirectoryInfo]} (nur Directories) die schnellste Methode... Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 6. April 2010 Melden Teilen Geschrieben 6. April 2010 schreibt der auch warum? Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 6. April 2010 Melden Teilen Geschrieben 6. April 2010 (bearbeitet) Auszug aus Seite 429: Because Dir retrieves directories as well as files, it can sometimes be important to limit the result of Dir only to files or only to directories. There are several ways to do this. You can either validate the attribute of the returned object, the PowerShell PSIsContainer property, or the object type: # List directories only:: Dir | Where-Object { $_ -is [system.IO.DirectoryInfo] } Dir | Where-Object { $_.PSIsContainer } Dir | Where-Object { $_.Mode.Substring(0,1) -eq "d" } # List files only: Dir | Where-Object { $_ -is [system.IO.FileInfo] } Dir | Where-Object { $_.PSIsContainer -eq $false} Dir | Where-Object { $_.Mode.Substring(0,1) -ne "d" } The first variant (controlling object types) is the fastest by far while the latter (text comparison) is more complex and slower as a result of it complexity. http://powershell.com/Mastering-PowerShell.pdf bearbeitet 6. April 2010 von Cybquest Noch'n Link hinzugefügt :) Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 6. April 2010 Melden Teilen Geschrieben 6. April 2010 danke! Zitieren Link zu diesem Kommentar
SeroSoft 10 Geschrieben 8. April 2010 Autor Melden Teilen Geschrieben 8. April 2010 ~ delete ~ Tut mir leid war mein Fehler ^^ das war zu peinlich um das hier stehen zu lassen. Wo keine Unterordner sind kann man keine finden :-) Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.