2016-10-25 3 views
0

Ich habe ein kleines Skript geschrieben, das mir hilft, Ordner effizienter von einem Ort zum anderen zu verschieben, indem komplette Befehle basierend auf einer Eingabedatei generiert werden.Hinzufügen von Text zur Eingabe, fügt nur zweiten Teil zur letzten Zeile hinzu

Code:

Get-Content inputfile.txt | 
    ForEach-Object { 
     "robocopy D:\Home\" + $_ + " H:\Home-E\" + $_ 
    } | Set-Content outputfile.txt 

Jetzt das funktioniert gut, außer dem letzten Teil wird nur bis zur letzten Zeile hinzugefügt.

Die Ausgabedatei sieht wie folgt aus:

robocopy D:\Home\ewja 
robocopy D:\Home\ewst 
robocopy D:\Home\ewwi 
robocopy D:\Home\ezga H:\Home-E\ezga

Weiß jemand, warum der zweite Teil von den ersten Zeilen abgeschnitten wird?

+0

vielleicht funktioniert das: 'cat inputfile.txt | % {"robocopy D: \ Home \ $ _ H: \ Home-D \ $ _"}> outfile.txt' –

+0

Ich habe das gleiche Ergebnis, aber es machte mir klar, Leerzeichen in der Eingabedatei kann das Problem sein. Ich werde das überprüfen und zu diesem Thread zurückkehren. –

+0

Ja, Leerzeichen nach jeder Zeile in meiner Eingabedatei haben alles durcheinander gebracht. Danke, dass Sie mich erkennen lassen! :) –

Antwort

0

Ihr Problem war eine rein visuelle ein:

Der hintere Raum nach jeder Zeile der Eingabedatei einfach so lange war - jede Zeile, aber der letzte zu 119 Zeichen rechten Raum gepolstert war - was der 2. Verweis auf $_ erweitert auf (der Teil beginnend mit H:\Home-E\...) war nur gescrollt außerhalb der Sicht.
Nur die letzte Linie war nicht platz gepolstert, so dass für den letzten Befehl der gesamte Ausgangsleitung in der Konsole zu sehen war.

Beachten Sie, dass die resultierenden Befehle noch arbeitete jedoch haben würde, da die Menge von Leerzeichen zwischen den auf einen Befehl übergebenen Argumente tut mater nicht.

Um das Problem an der Quelle zu beheben:

Get-Content inputfile.txt | 
    ForEach-Object { 
     $_ = $_ -replace '\s+$' # trim trailing whitespace from input line 
     "robocopy D:\Home\" + $_ + " H:\Home-E\" + $_ 
    } | Set-Content outputfile.txt 

Beachten Sie, dass String-Interpolation in Strings in doppelten Anführungszeichen kann Aufbau der Befehlsfolge macht etwas einfacher "robocopy D:\Home\$_ H:\Home-E\$_"

jedoch weder Ansatz im Allgemeinen robust ist, in dem es brechen kann den konstruierten robocopy Befehl mit Dateinamen, die eingebettete Leerzeichen haben, zum Beispiel, so dass Sie Quoting/Escaping der Eingabedateinamen durchführen müssten.
Der spezifische Ansatz hängt davon ab, welche Shell am Ende die Datei ausführen wird, die die konstruierten Befehle enthält.

0

Ausgeblendete Leerzeichen nach jeder Zeile in meiner Eingabedatei haben alles durcheinandergebracht. Entfernt die Leerzeichen und alles hat wie erwartet funktioniert.

+0

Leerzeichen am Ende der Eingabezeilen erklären nicht das in Ihrer Frage beschriebene Verhalten. Probiere ''abc', 'def' | % {"robocopy D: \ Home \" + $ _ + "H: \ Home-E" + $ _} '. Es wäre interessant, die wahre Ursache zu kennen. – mklement0

+0

Ok, ich werde es morgen versuchen, wenn ich wieder Zugriff auf die Eingabedatei bekomme und Sie wissen lasse, aber es ist komisch, dass ich das gleiche Ergebnis mit dem Vorschlag von Metix bekommen habe, was ganz anders ist, wenn das nicht der Fall ist. Ich könnte die Eingabedatei auch hochladen, wenn Sie es sich ansehen wollen. –

+0

Der Befehl 'metix' ist Ihrer Arbeit gleichwertig, also bin ich nicht überrascht, dass er das gleiche Ergebnis liefert. Wenn Sie mir einen Link zu einer hochgeladenen Eingabedatei geben können, schaue ich sie mir gerne an. Welche PowerShell-Version übrigens? – mklement0

Verwandte Themen