lukasskywalker
Goto Top

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:
$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
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

Content-ID: 6111428399

Url: https://administrator.de/forum/powershell-skript-problem-6111428399.html

Ausgedruckt am: 22.12.2024 um 12:12 Uhr

3063370895
3063370895 24.02.2023 aktualisiert um 11:28:06 Uhr
Goto Top
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"  
SlainteMhath
SlainteMhath 24.02.2023 um 11:29:38 Uhr
Goto Top
Moin,

help rename-item
ist dein Freund face-smile

lg,
Slainte
LukasSkywalker
LukasSkywalker 24.02.2023 um 11:51:06 Uhr
Goto Top
Zitat von @chaot1coz:

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?
3063370895
3063370895 24.02.2023 aktualisiert um 11:52:55 Uhr
Goto Top
Zitat von @LukasSkywalker:

Zitat von @chaot1coz:

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
}
LukasSkywalker
LukasSkywalker 24.02.2023 um 11:53:58 Uhr
Goto Top
Zitat von @chaot1coz:

Zitat von @LukasSkywalker:

Zitat von @chaot1coz:

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
}

Habe ich bereits. Die Fehlermeldung bleibt die selbe.
3063370895
3063370895 24.02.2023 aktualisiert um 11:56:09 Uhr
Goto Top
$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.
3063370895
3063370895 24.02.2023 aktualisiert um 12:03:16 Uhr
Goto Top
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
    }
}
LukasSkywalker
LukasSkywalker 24.02.2023 um 12:05:54 Uhr
Goto Top
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.
3063370895
3063370895 24.02.2023 um 12:08:28 Uhr
Goto Top
Zitat von @LukasSkywalker:

Das verstehe ich. Der neue String wird in der Variable $newName gespeichert, oder nicht?
Korrekt.
Und mit dem Rename-Item Befehl ersetze ich den alten String gegen den neuen String.
Rename-Item benennt die Datei um.
thebluesman
thebluesman 24.02.2023 um 12:54:53 Uhr
Goto Top
LukasSkywalker
LukasSkywalker 24.02.2023 um 13:36:35 Uhr
Goto Top
Zitat von @chaot1coz:

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
    }
}

Also hier kommt wieder eine Fehlermeldung für jede Datei:
item.Name.Contains : Die Benennung "item.Name.Contains" wurde nicht als Name eines Cmdlet, einer Funktion, einer
Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad
korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.

Wobei ich nicht ganz verstehe, was die If-Funktion an der Fehlermeldung hätte ändern können 'face-smile Letztendlich passiert ja genau das selbe, nur, dass eben vorher geprüft wird, ob sich ein Leerzeichen innerhalb des Strings befindet.
3063370895
3063370895 24.02.2023 aktualisiert um 13:41:00 Uhr
Goto Top
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“)
LukasSkywalker
LukasSkywalker 24.02.2023 um 14:12:41 Uhr
Goto Top
Es wurde kein Positionsparameter gefunden, der das Argument
"Korrektur-_und_Vorbeugemaßnahmen" akzeptiert.
3063370895
Lösung 3063370895 24.02.2023 aktualisiert um 14:44:18 Uhr
Goto Top
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  
LukasSkywalker
LukasSkywalker 24.02.2023 um 15:46:14 Uhr
Goto Top
Zitat von @chaot1coz:

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?
3063370895
Lösung 3063370895 24.02.2023 aktualisiert um 16:01:55 Uhr
Goto Top
Zitat von @LukasSkywalker:

Zitat von @chaot1coz:

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 face-smile