2016-04-27 20 views
0

Ich versuche, Leerzeichen aus vielen Dateinamen mit PowerShell 3.0 zu entfernen. Hier ist der Code, ich arbeite mit:Wie entferne ich Leerzeichen aus Dateinamen

$Files = Get-ChildItem -Path "C:\PowershellTests\With_Space" 
Copy-Item $Files.FullName -Destination C:\PowershellTests\Without_Space 
Set-Location -Path C:\PowershellTests\Without_Space 
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace ' ','' } 

Zum Beispiel: das With_Space Verzeichnis hat diese Dateien:

Cable Report 3413109.pdf 
Control List 3.txt 
Test Result Phase 2.doc

Das Without_Space Verzeichnis müssen die oben genannten Dateinamen sein:

CableReport3413109.pdf 
ControlList3.txt 
TestResultPhase 2.doc

Derzeit zeigt das Skript keinen Fehler, aber es kopiert nur die Quelldateien in den Zielordner, entfernt jedoch nicht die Leerzeichen in den Dateinamen.

+0

Bitte keine Änderungen vornehmen, eine Antwort in Frage. Stattdessen [akzeptieren] (http://meta.stackoverflow.com/a/5235) die Antwort, die Sie am hilfreichsten bei der Lösung Ihres Problems halten. –

Antwort

7

Ihr Code sollte gut funktionieren, aber da Get-ChildItem *.txt Listen-Dateien nur .txt die letzte Anweisung sollte die Räume von nur Textdateien, so dass Sie ein Ergebnis wie dieses entfernen:

Kabelbericht 3413109.pdf
ControlList3.txt
Tester Phase 2.doc

Diese Leerzeichen aus den Namen aller Dateien in dem Ordner entfernen soll:

Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace ' ','' } 

Vor Powershell v3 diese verwenden Verarbeitung zu beschränken, um nur Dateien:

Get-ChildItem | Where-Object { -not $_.PSIsContainer } | 
    Rename-Item -NewName { $_.Name -replace ' ','' } 
+0

Danke Ansgar, es hat funktioniert! Ich schätze Ihre Hilfe. – Sohel

2

so etwas wie dies funktionieren könnte

$source = 'C:\temp\new' 
$dest = 'C:\temp\new1' 
Get-ChildItem $source | % {copy $_.FullName $(join-path $dest ($_.name -replace ' '))} 
+0

Danke Anthony. Ich werde den Code überprüfen, den du geschrieben hast. Ich schätze Ihre Hilfe. – Sohel

3

Ich denke, Ihr Skript fast funktionieren soll, außer $_ wird nicht als etwas definiert werden. Wenn Sie das for-each-Cmdlet (%) verwenden, weisen Sie es zu und können es dann verwenden.

Get-ChildItem *.txt | %{Rename-Item -NewName ($_.Name -replace ' ','')} 

EDIT: Diese Auslegung war völlig falsch. Einige Leute scheinen es nützlich gefunden zu haben, aber sobald Sie etwas in der Pipeline haben, scheint es, dass $_ auf das Objekt verweist, das sich momentan in der Pipe befindet. Mein Fehler.

+0

Die aktuelle Objektvariable ('$ _') funktioniert im angegebenen Kontext einwandfrei. Das Ausführen von 'Rename-Item' in einer' ForEach-Object'-Schleife ist nicht erforderlich. –

+0

Danke @AnsgarWiechers! Ich hatte versucht, Rename-Item durch Echo zu ersetzen, um zu sehen, was vor sich ging, und die falschen Schlüsse gingen von dort aus. –

+0

Danke Jared und Ansgar, es hat funktioniert! Ich schätze Ihre Hilfe. – Sohel

Verwandte Themen