PowerShell Skript Problem
Hey,
ich habe gerade erst angefangen mich mit PowerShell auseinanderzusetzen und habe mit meinem Skript ein Problem, an dem ich gerade hängen bleibe.
Ausgangssituation:
Ich habe eine Ordnerstruktur, welche über mehrere Monate hinweg gepflegt worden ist (mit diversen Unterordnern und Dateien). Innerhalb dieser Datenstruktur wurde allerdings keine einheitliche Schreibweise verwendet.
Ziel:
Das Ziel für den Anfang besteht erstmal darin, alle Leerzeichen mit einem Unterstrich zu tauschen:
Alter Ordner: "1. Mandant Muster Firma" | Neuer Ordner: "1._Mandant_Muster_Firma"
Das ist mein bisheriger Code:
Mit diesem Skript kommt allerdings die Fehlermeldung:
Ich wäre für eine Lösung mit Erklärung sehr dankbar, da mein Anspruch ist, zu verstehen, weshalb mein Code nicht funktinoiert hat...
Vielen Dank im Voraus
Lukas
ich habe gerade erst angefangen mich mit PowerShell auseinanderzusetzen und habe mit meinem Skript ein Problem, an dem ich gerade hängen bleibe.
Ausgangssituation:
Ich habe eine Ordnerstruktur, welche über mehrere Monate hinweg gepflegt worden ist (mit diversen Unterordnern und Dateien). Innerhalb dieser Datenstruktur wurde allerdings keine einheitliche Schreibweise verwendet.
Ziel:
Das Ziel für den Anfang besteht erstmal darin, alle Leerzeichen mit einem Unterstrich zu tauschen:
Alter Ordner: "1. Mandant Muster Firma" | Neuer Ordner: "1._Mandant_Muster_Firma"
Das ist mein bisheriger Code:
$WhatIfPrefernce = $true
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
$newName = $item.Name
$newName.Replace(" ", "_")
Rename-Item $item -NewName $newName
}
Mit diesem Skript kommt allerdings die Fehlermeldung:
Rename-Item : Es wurde kein Parameter gefunden, der dem Parameternamen " " entspricht.
In Zeile:9 Zeichen:19
+ Rename-Item $item -Name $newName
+ ~~~~~
+ CategoryInfo : InvalidArgument: (:) [Rename-Item], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.RenameItemCommand
Vielen Dank im Voraus
Lukas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6111428399
Url: https://administrator.de/contentid/6111428399
Ausgedruckt am: 21.11.2024 um 20:11 Uhr
16 Kommentare
Neuester Kommentar
Hi,
Der Parameter für den neuen Namen bei Rename-Item lautet "NewName".
Gib mal in der PS ein:
Dann bekommst du unter anderem folgendes angezeigt:
Der Parameter für den neuen Namen bei Rename-Item lautet "NewName".
Gib mal in der PS ein:
Get-Help Rename-Item -Examples
Dann bekommst du unter anderem folgendes angezeigt:
Rename-Item -Path "c:\logfiles\daily_file.txt" -NewName "monday_file.txt"
Zitat von @LukasSkywalker:
Das New habe ich hinzugefügt. Danke dir.
Kann ich denn nicht den Path und den neuen Namen als Variable angeben?
Zitat von @chaot1coz:
Hi,
Der Parameter für den neuen Namen bei Rename-Item lautet "NewName".
Gib mal in der PS ein:
Dann bekommst du unter anderem folgendes angezeigt:
Hi,
Der Parameter für den neuen Namen bei Rename-Item lautet "NewName".
Gib mal in der PS ein:
Get-Help Rename-Item -Examples
Dann bekommst du unter anderem folgendes angezeigt:
Rename-Item -Path "c:\logfiles\daily_file.txt" -NewName "monday_file.txt"
Das New habe ich hinzugefügt. Danke dir.
Kann ich denn nicht den Path und den neuen Namen als Variable angeben?
Klar, du musst nur das -Name zu -NewName ändern.
Also so:
$WhatIfPrefernce = $true
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
$newName = $item.Name
$newName.Replace(" ", "_")
Rename-Item -Path $item -NewName $newName
}
$WhatIfPrefernce = $true
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
$newName = $item.Name
$newName = $newName.Replace(" ", "_")
Rename-Item -Path $item -NewName $newName
}
.Replace() bearbeitet nicht den String, sondern gibt einen neuen String zurück.
Damit du keine Fehlermeldung bekommst weil alter und neuer Name gleich sind:
$WhatIfPrefernce = $true
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
if($item.Name.Contains(" "){
$newName = $item.Name
$newName = $newName.Replace(" ", "_")
Rename-Item -Path $item -NewName $newName
}
}
Zitat von @LukasSkywalker:
Das verstehe ich. Der neue String wird in der Variable $newName gespeichert, oder nicht?
Korrekt.Das verstehe ich. Der neue String wird in der Variable $newName gespeichert, oder nicht?
Und mit dem Rename-Item Befehl ersetze ich den alten String gegen den neuen String.
Rename-Item benennt die Datei um.
Mein Fehler. Da fehlt ein $ direkt vor item.Name.Contains(), habe den Beitrag editiert.
Die if-Abfrage bewirkt, dass Dateien ohne Leerzeichen nicht umbenannt werden. Wenn man rename-item mit ungeändertem Dateinamen ausführt, wird ein Fehler ausgeben.
(sinngemäß „Quell- und Zielname identisch“)
Die if-Abfrage bewirkt, dass Dateien ohne Leerzeichen nicht umbenannt werden. Wenn man rename-item mit ungeändertem Dateinamen ausführt, wird ein Fehler ausgeben.
(sinngemäß „Quell- und Zielname identisch“)
Uff sorry. Die vorherigen Kommentare hab ich am Smartphone geschrieben.
Man kann das ganze auch in eine Zeile packen:
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
if($item.Name.Contains(" ")){
$newName = $item.Name
$newName = $newName.Replace(" ", "_")
Rename-Item -Path $item -NewName $newName
}
}
Man kann das ganze auch in eine Zeile packen:
Get-ChildItem -Directory -Force -Recurse -Path "C:\Users\Skywalker\Desktop\test_ordner" | Rename-Item -NewName {$_.Name -replace " ","_"} -ErrorAction SilentlyContinue
Zitat von @LukasSkywalker:
Funktioniert. Vielen Dank!
Die Logik dahinter war jetzt, die Fehlermeldungen einfach zu überspringen?
Zitat von @chaot1coz:
Uff sorry. Die vorherigen Kommentare hab ich am Smartphone geschrieben.
Man kann das ganze auch in eine Zeile packen:
Uff sorry. Die vorherigen Kommentare hab ich am Smartphone geschrieben.
Set-Location -Path "C:\Users\Skywalker\Desktop\test_ordner"
$all_directorys = Get-ChildItem -Directory -Force -Recurse
foreach ($item in $all_directorys)
{
if($item.Name.Contains(" ")){
$newName = $item.Name
$newName = $newName.Replace(" ", "_")
Rename-Item -Path $item -NewName $newName
}
}
Man kann das ganze auch in eine Zeile packen:
Get-ChildItem -Directory -Force -Recurse -Path "C:\Users\Skywalker\Desktop\test_ordner" | Rename-Item -NewName {$_.Name -replace " ","_"} -ErrorAction SilentlyContinue
Funktioniert. Vielen Dank!
Die Logik dahinter war jetzt, die Fehlermeldungen einfach zu überspringen?
Beim ersten Skript wird der Ordner nur umbenannt wenn ein Leerzeichen enthalten ist.
Beim zweiten (kurzen) Skript wird die Fehlerausgabe durch -ErrorAction SilentlyContinue unterdrückt.
Kann man in dem Fall machen, da man ja weiß, warum Fehlermeldungen angezeigt werden.
Wenn dein Anliegen gelöst ist markiere bitte die entsprechenden Antworten als Lösung