sokratonis
Goto Top

Finde Dateiinhalt- Suche an anderem Ort danach- Ändere Dateiname

Hallo,

ich mal wieder und habe immer noch mein Problem von neulich - diesmal beschreibe ich es hoffentlich besser.
Ich brauche für folgendes ein Powershell-Script:

In Ordner A kommen immer wieder neue Dateien, die nach 10 Minuten in einen Ordner B verschoben werden. Zusätzlich wird beim Verschieben in Ordner B eine Kopie im Unterordner SAVE von Ordner A abgelegt.
Struktur:

C:\temp\OrdnerA
C:\temp\OrdnerA\save (Kopie v. Original nach 10 Min. aus Ordner A)
C:\temp\OrdnerB (Original n. 10 Min. aus Ordner A)

In den 10 Minuten hätte ich gern folgendes geprüft:

In einer Beispieldatei sind mehrere Zeilen mit Text. Eine Zeile davon beginnt immer mit "HMAAA+123+". Nach dem PLUS folgt eine Nummer, die unterschiedlich ist. Nun kann diese Nummer aber auch nochmal vorkommen. Deshalb stelle ich mir das Script wie folgt vor:

Lese Datei in OrdnerA aus und suche nach HMAAA+123+. Speichere Nummer zwischen. Suche die Nummer in den Daten von OrdnerB. Wenn Nummer nicht gefunden, OK. Wenn Nummer gefunden, füge eine 2 im Dateinamen (Datei aus OrdnerA) hinzu.

Content-ID: 547284

Url: https://administrator.de/forum/finde-dateiinhalt-suche-an-anderem-ort-danach-aendere-dateiname-547284.html

Ausgedruckt am: 23.12.2024 um 09:12 Uhr

certifiedit.net
certifiedit.net 14.02.2020 um 19:07:22 Uhr
Goto Top
Hallo sokratonis,

und wo ist deine Vorarbeit dazu? Was hast du bereits?

Viele Grüße,

Christian
certifiedit.net
142970
Lösung 142970 16.02.2020 aktualisiert um 16:07:18 Uhr
Goto Top
Ansatz für dich so wie ich deine Beschreibung interpretiert habe:
$ordnerA = 'D:\OrdnerA'  
$extension = '*.txt'  
$ordnerB = 'D:\OrdnerB'  

sls $ordnerA\* -Pattern "HMAAA\+(\d+)\+" -Include $extension | %{  
    $num = $_.Matches.Groups[1].Value
    if ($num -ne $null){
        $found = sls $ordnerB\* -Pattern $num -SimpleMatch -Quiet -Include $extension
        if ($found){
            rename-item $_.Path -NewName ([io.Path]::GetFileNameWithoutExtension($_.Path) + "_2" + [io.Path]::GetExtension($_.Path)) -verbose  
        }
    }
}
sokraTonis
sokraTonis 17.02.2020 um 09:12:00 Uhr
Goto Top
Hallo soccer,

danke für die schnelle Hilfe face-smile. Das Script funktioniert in soweit, dass ich bis Zeile 10 komme und dann auf eine Fehlermeldung treffe:
"Rename-Item: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird."

Die Datei ist aber nicht geöffnet, zumindest nicht separat als Datei.
142970
142970 17.02.2020 aktualisiert um 09:15:20 Uhr
Goto Top
Zitat von @sokraTonis:

Hallo soccer,

danke für die schnelle Hilfe face-smile. Das Script funktioniert in soweit, dass ich bis Zeile 10 komme und dann auf eine Fehlermeldung treffe:
"Rename-Item: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird."
Dann öffne den ProcessExplorer und schau nach von welchem Prozess die Datei blockiert wird.

Funktioniert hier nämlich einwandfrei.
sokraTonis
sokraTonis 17.02.2020 um 10:07:37 Uhr
Goto Top
Hi,

im ProcessExplorer ist die Datei nirgends aufgeführt - auch der Prozess nicht. Zwischenzeitlich habe ich mal neugestartet und eine Aufgabe geplant, in der die Powershell ausgeführt wird.
Ich habe die Testordner / Testdaten auch mal lokal abgelegt, nicht auf dem Netzlaufwerk. Trotzdem kommt bei mir die Fehlermeldung.
142970
142970 17.02.2020 um 10:39:06 Uhr
Goto Top
Tja wir kennen dein System und die Dateien die es benutzt nicht. Wie gesagt läuft hier problemlos, liegt also nicht am Skript.
sokraTonis
sokraTonis 17.02.2020 um 10:44:03 Uhr
Goto Top
Gut. Danke auf jeden Fall face-smile.
sokraTonis
sokraTonis 18.02.2020 aktualisiert um 10:20:48 Uhr
Goto Top
Seltsam. Bei mir steht das Problem immer noch:

AUSFÜHRLICH: Ausführen des Vorgangs "Datei umbenennen" für das Ziel "Element: C:\temp\ordnerA\0000000000005720200212-1637446_HH.txt Ziel: C:\temp\ordnerA\000000000000572
0200212-1637446_HH_2.txt".
Rename-Item : Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.
In C:\Temp\OrdnerA\HH.ps1:10 Zeichen:12
Rename-Item $_.Path -NewName ([io.Path]::GetF ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : WriteError: (C:\temp\OrdnerA\...-1637446_HH.txt:String) [Rename-Item], IOException
FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Getestet auf mittlerweile 3 Systemen mit Windows 10, auch als Administrator ausgeführte Powershell-Datei.

Hat hierzu jemand vielleicht noch eine Idee?
sokraTonis
sokraTonis 18.02.2020 um 12:04:49 Uhr
Goto Top
Ich habe es jetzt etwas anders gelöst. Wenn ich nämlich Rename-Item durch New-Item ersetze und einen anderen Pfad anwähle, dann klappts. Ich habe aber noch eine weitere Frage:
Das Script schaut doch aktuell nur nach "HMAA+123+" oder? Die Nummer dahinter, die wichtige, die ist gar nicht berücksichtigt?
sokraTonis
sokraTonis 18.02.2020 um 20:59:29 Uhr
Goto Top
Zum Abschluss gilt noch folgendes zu sagen:

@142970, danke dir für deine schnelle Hilfe
---
Da auch dieses Script die Variable hinter HMAA+123+%variable% nicht berücksichtigt hat, habe ich nun systemseitig eine zusätzliche - immer gleich bleibende Zeile aufgenommen - die nur ausgegeben wird, wenn HMAA+123+%variable% doppelt vorhanden ist.
Dadurch lässt sich das Script abkürzen auf folgender Basis:
Suche festen Bestandteil > wenn da ändere Dateinamen (funktioniert auch) > wenn nein verwirf die Änderung.
142970
142970 18.02.2020 aktualisiert um 23:24:36 Uhr
Goto Top
Zitat von @sokraTonis:

Zum Abschluss gilt noch folgendes zu sagen:

@142970, danke dir für deine schnelle Hilfe
---
Da auch dieses Script die Variable hinter HMAA+123+%variable% nicht berücksichtigt hat,

Tja, du hättest auch einfach selbst in Zeile 5 den entsprechenden Pattern anpassen können (deine Beschreibung war leider nicht eindeutig genug für uns), aber wenn man noch nicht mal gewillt ist sich minimal mit Codes zu beschäftigen, dann tust du mir ehrlich gesagt auch nicht leid.
Lies und lerne von Codes, nicht "Frage und machst du bidde fertisch" lautet das Motto.

So long.