2017-07-06 7 views
0

Ich habe hunderttausende Dateien in ~ 40 Ordnern (diese Unterordner befinden sich in einem gleichen Super-Ordner, den ich "Test" nennen werde). Ich habe versucht, Powershell zu verwenden, um eine Syntax zu ersetzen, die im Ordnernamen aber auch in den Dateinamen gefunden wird.Batch-Datei und Ordner umbenennen in Windows Powershell

Grundsätzlich meine Ordner und Dateien enthalten die gleiche Zeichenfolge „PXXXX_0“, die ich Batch will umbenennen in „PXXXX_“

Hier ist der Code, den ich verwenden, um die Dateien zuerst & Ordner von Interesse Karte

cd C:\test 

Get-ChildItem -Filter "*PXXXX_0*" -Recurse | Rename-Item -NewName {$_.name -replace 'PXXXX_0', 'PXXXX_'} -whatif 

Das gibt mir die richtigen Dateien und in der Vorschau Aktion (zB

What if: Performing operation "Rename File" on Target "Item: C:\test\PXXXX_053\PXXXX_053_558.jpg Destination C:\test\PXXXX_053\PXXXX_53_558.jpg 

scheint also diese zu arbeiten, aber nur auf die Dateien in den Ordnern, die ich auch umbenennen möchte.

Nun, wenn ich den Code starten, ohne -whatif es das scheint nur die Ordnernamen umbenennen werden, die Dateien nicht ...

ich ziemlich sicher, dass ich etwas verpasst haben, aber da ich bin nicht wirklich vertraut mit dieser Sprache Ich kämpfe um die Lösung. Ich benutze Powershell v1.0

Danke für jede Hilfe.

Beste

+4

Wenn der Ordner umbenannt wird, sind die Dateipfade innerhalb des Ordners vermutlich falsch, da der Ordner unter diesem Namen nicht mehr existiert. Versuchen Sie zuerst, die Dateien umzubenennen, indem Sie '.. -Recurse | where-object {-not $ _. PsIsContainer} | Rename-Item ..'und dann wiederholen, um die Ordner umzubenennen, vielleicht? – TessellatingHeckler

+0

Danke, es hat wie ein Zauber funktioniert! – Rhiz

Antwort

0

One Liner:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; foreach ($item in $items) { $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; rename-item $item.fullname -NewName $newName; } 

Einfach auf den Augäpfeln:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; 
foreach ($item in $items) { 
    $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; 
    rename-item $item.fullname -NewName $newName; 
} 

Kurz gesagt, Powershell-1 wurde versucht, die Datei nur mit dem Dateinamen umzubenennen, nicht die vollständigen Pfad. Grundsätzlich konnte es Ihre Dateien nicht finden, wenn sie in Unterordnern waren.

Ich habe Ihre Logik in V5 getestet und es funktioniert so, wie Sie es erwarten würden.

Ich gehe hier ein wenig aus und nehme an, dass Sie versuchen, dieses Skript über System Center Orchestrator auszuführen, da Sie mit PowerShell v1 arbeiten. Ich habe diesen Schmerz gefühlt. Ich empfehle, alle PS-Skripte für Runbooks in invoke-command -scriptblock {} -Credential $myCreds Blöcke zu verpacken. Dies fördert die Ausführung auf der PowerShell-Version des Zielsystems. Es macht es auch sehr einfach, auf einem Computernamen anzuhängen, um das Skript auf dem Ziel statt auf dem Runbook-Server auszuführen.

Sie können dann einen Benutzernamen und ein Passwort-Paar als Koordinationsrechner-Variablen speichern (verwenden Sie die Verschlüsselungsoption) und fügen Sie sie in Ihre oben genannte Anweisung für die Anmeldeinformationen ein. Es fühlt sich zunächst sehr unordentlich an, aber man gewöhnt sich daran.

dies zu testen, lief ich mit Powershell -Version 1. Hier ist mein $ PSVersionTable ist:

Name       Value 
----       ----- 
CLRVersion      2.0.50727.8689 
BuildVersion     6.1.7600.16385 
PSVersion      2.0 
WSManStackVersion    2.0 
PSCompatibleVersions   {1.0, 2.0} 
SerializationVersion   1.1.0.1 
PSRemotingProtocolVersion  2.1 

Es hatte das gleiche Problem, aber es könnte nicht ein 1 für 1 Spiel sein, was Orchestrator geht zu renne ein. Sende die Ausgabe, wenn es nicht funktioniert und ich werde mein Bestes geben.

Verwandte Themen