robdox
Goto Top

PowerShell opAddition Fehler beim Kopieren und Umbenennen von Dateien

Hallo zusammen,

ich mal wieder - ich finde keine Lösung zum folgenden Problem. Das PowerShellskript kopiert als erstes Dateien von einen in einen anderen Ordner, danach sollen die Dateien mit einer SQL Abfrage, dynamisch abgeändertwerden im Namen. Dies funktioniert auch - aber! - Nachdem die Dateien kopiert wurden und das Umbenennen beginnen soll (hier hole ich mir nochmal alle kopierten Dateien in einen Array, damit ich diesen in der Schleife entsprechend der SQL Anweisung abändern kann) bekommeich folgende Fehlermeldung:

Fehler beim Aufrufen der Methode, da [System.IO.DirectoryInfo] keine Methode mit dem Namen "op.Addition" enthält.  

Wenn ich den "neuen Pfad vom Kopieren" bzw diesen Pfad zum auslesen aller Dateien manuelle angebe, oder das Skript in zwei Schritten manuell durchführe, also erst den Kopiervorgang, danach das Umbenennen, bekomme ich keine Fehlermeldun.

Was genau geht hier schief? An der Pfadzusammenstellen "$toDIR" erkenne ich keinen Fehler.

function querySQL {
    Param(
        [string]$cSQL
    )
    $connectionString = "..."  

    # SQL Verbindung aufbauen
    $connection            = New-Object system.data.SqlClient.SQLConnection($connectionString)
    $command               = New-Object system.data.sqlclient.sqlcommand($cSQL,$connection)
    $connection.Open()
    $adapter               = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset               = New-Object System.Data.DataSet
    try{
    # Tabelle erstellen
    $adapter.Fill($dataSet) | Out-Null
    $connection.Close()
    $dataSet.Tables
    }catch{
        Write-Host "SQL Ergebnis war unschlüssig." -ForegroundColor Yellow  
    }
}
    $j=@(10..([datetime]::now).tostring("yy"))  
    $m=@(1..12)

    try{
    [int]$Jahr=read-host "Welches Jahr? (2019 = 19, 2020 = 20, etc.)" -ErrorAction Stop   
    [int]$Monat=read-host "Welcher Monat? (Januar = 1, Februar = 2, etc.)"  -ErrorAction Stop  
    }catch{
        Write-Host "Keine gültige Eingabe!" -ForegroundColor Yellow  
        exit
    }
    if($Jahr -in $j){
        if($Monat -in $m){
            if($Monat -le 9){
                $Pfad=$("\\DC\DXS\20"+$Jahr+"0"+$Monat+"\SENDLIEF\")  
            } else {
                $Pfad=$("\\DC\DXS\20"+$Jahr+$Monat+"\SENDLIEF\")  
            }
        }
    } else {
        write-host "Eingabe $Jahr - Nur zweistellig bitte." -ForegroundColor Yellow  
        exit
    }
    if(!(Test-Path $($Pfad.Replace('SENDLIEF\','')+"S_RENAME"))){  
        $toDIR=New-Item -Path $($Pfad.Replace('SENDLIEF\','')+"S_RENAME") -ItemType Directory  
    } else {
        $toDIR=$($Pfad.Replace('SENDLIEF\','')+"S_RENAME")  
    }
    [array]$LS=(Get-ChildItem -Path $($Pfad+"\*") -Include "*.pdf") | Copy-Item -Destination $toDIR  
   #--------------------- Bis hierhin klappt alles wunderbar!

    [array]$DIR=(Get-ChildItem -Path $($toDIR+"\*") -Include "*.pdf") | ?{($_.BaseName -notlike '(SUNDL)*')}   
   #-------------------- Hier wird der Fehler markiert in der Meldung....

   #-------------------- würde funktionieren, jedoch Abbruch. s.o ....  
    for($i=0;$i -lt $DIR.Length; $i++){
        $str=$DIR[$i].BaseName
        $Nr_Ref1=$str.split("_")  
        $Nr_Alfa=$str.split("_")[1]  
        $CMD="..... and Nr_Ref1 like'$Nr_Ref1%' and alfanumAnw5='$Nr_Alfa'"  
        [array]$Rename=(querySQL -cSQL $CMD).NEW
              
              for($x=0;$x -lt $Rename.Length; $x++){
                write-host "Dateiname: " $DIR[$i].Fullname", wird in unbenannt " $Rename[$x] -ForegroundColor Cyan  
                try{Rename-Item -Path $DIR[$i].FullName -NewName $Rename[$x] -ErrorAction Stop}
                catch{write-host "Datei $Rename vermutlich schon umbenannt." -ForegroundColor Yellow}  
              }  
    }

Danke wieder vorab für schnelle Hilfe!!

Content-ID: 627075

Url: https://administrator.de/contentid/627075

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

146707
Lösung 146707 30.11.2020 aktualisiert um 11:51:22 Uhr
Goto Top
Die Fehlermeldung ist doch eindeutig face-smile.
$($toDIR+"\*")
Das ist dein Fehler du versuchst ein Objekt ($toDir ist hier kein String sondern ein Objekt) mit dem Typ [DirectoryInfo] mittels + Operator mit einem STRING zu verknüpfen und das klappt eben nicht, gebe die entsprechende String-Property des Objekts an dann klappt auch das
($toDir.FullName + "\*")
oder alternativ kann man das Konstrukt auch ohne Plus schreiben
"$($toDir.FullName)\*"
Also in dieser Zeile gesamt dann so
[array]$DIR=Get-ChildItem -Path "$($toDir.FullName)\*" -Include "*.pdf" | ?{$_.BaseName -notlike '(SUNDL)*'} 
Oder wandele alternativ vorher die Variable $toDir in einen reinen String um indem du dort schon die Property angibst.
$toDIR=(New-Item -Path ($Pfad.Replace('SENDLIEF\','')+"S_RENAME") -ItemType Directory).FullName
robdox
robdox 30.11.2020 um 12:06:41 Uhr
Goto Top
Danke! Habe ich so nicht verstanden, aber ergibt Sinn face-smile

Angenehmen Tag noch!