Wie löse ich dieses Problem in Batch?

2 Antworten

mit robocopy ... /mon:1 /mot:1 wird robocopy in einen endlosen zustand versetzt, welcher immer wieder die beim start übergebene Kommandozeile ausführt. (damit ist keine Änderung des Zielnamens oder anderer Parameter mehr möglich!)

Auch weitere nachfolgende Batchbefehle kommen nicht mehr zum Zuge.

Ich hatte Dir ja bereits eine Zeitgesteuerte und Prozessabhängige Lösung offeriert: https://www.gutefrage.net/frage/wie-schreibe-ich-folgende-bat-datei#answer-371044289

Eine Dateisystem-Ereignisabhängige Steuerung lässt sich in batch eher schwierig bewerkstelligen.

Dateisystemereignisse kann man mit der Filesystem-Watcher Klasse einrichten. Dies ist jedoch nur mit Sprachen wie c# oder Powershell etc. möglich. https://docs.microsoft.com/de-de/dotnet/api/system.io.filesystemwatcher?view=netcore-3.1

filewatch.ps1

  #hier  Deine Pfade
$SourceFolder='C:\Users\Erzesel Secure\Desktop\testOrdner'
$DestinationFolder='C:\Users\Erzesel Secure\Desktop\sammelordner'
$FolderName=$SourceFolder.split("\")[-1]


  #definiere eine Userfunktion, welche im Actionblock aufgerufen werden kann
  #Achtung!  Global definieren  
function global:MyCopy() {
      #ZielPfad zusammenpfriemeln
    $DestinationPath='{0}\{1}-{2}' -f $DestinationFolder,$FolderName,(Get-Date -Format "yyyyMMdd-HHmmss_ffff")
      #kopieren
    Copy-Item -Path $SourceFolder -Destination $DestinationPath -Recurse
}

  ### erzeuge  einen  Dateisystembeobachter
$watcher=New-Object System.IO.FileSystemWatcher
  #zu beobachtender Ordner 
$watcher.Path=$SourceFolder
  #Dateimaske, welche Dateien beobchtet werden sollen (hier  alle)
$watcher.Filter='*.*'
  #auch Unterverzeichnisse beobachten
$watcher.IncludeSubdirectories=$true
$watcher.EnableRaisingEvents=$true  

### was soll getan werden  (scriptblock variable)
$action={
      #Datei, welche  das ereignis ausgelöst  hat...
    $path = $Event.SourceEventArgs.FullPath
      #welche Veränderung der Auslöser  war
    $changeType = $Event.SourceEventArgs.ChangeType
      #etwas  anzeigen
    Write-Host "$path was $changetype at $(get-date)"
    MyCopy
}

### registriere  Ereignisse, auf welche wie reagiert werden soll 
  #du  kannst  natürlich für jedes ereignis auch  eine  eigene Actionvariable definieren
  #...oder einfach nur  das Ereignis  registrieren, auf welches Du reagieren möchtest
Register-ObjectEvent $watcher "Created" -Action $action|Out-Null
Register-ObjectEvent $watcher "Changed" -Action $action|Out-Null
Register-ObjectEvent $watcher "Deleted" -Action $action|Out-Null
Register-ObjectEvent $watcher "Renamed" -Action $action|Out-Null


  #Endlosschleife. Welche das Script geöffnet hält reaktionszeit auf  ereignisse 5 sekunden
while ($true) {
    'warte...';
    sleep 5
}

Zugegeben das ist auch für mich nicht unbedingt übliche Alltagsroutine. Für das Handling kurzaufeinanderfolgender Ereignisse habe ich so aus dem Stehgreif auch keine Lösung.

Powershell kann zwar auf asynchrone Ereignisse reagieren, aber hat Probleme mit dem Zugriff auf Variablen außerhalb des aktuellen Geltungsbereiches. Der Action-block ist ein defacto eigenes Programm, welches nur indirekt mit dem Script interagiert und somit auch keinen Zugriff auf den Ereignisstapel hat...und damit auch nicht feststellen kann ob und wann ein vorangegangenes Ereignis ausgelöst wurde. oder ob noch Ereignisse in der Warteschlange sind.

siehe auch: https://www.msxfaq.de/code/powershell/ps_und_callbackfunktion.htm

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Was passiert, wenn Du Anweisungen zu date komplett weglässt?

Woher ich das weiß:Berufserfahrung – ich arbeite schon sehr lange im EDV Bereich, viele Sparten

Habe es probiert, es passiert einfach nichts. Habe Set Bdate=%date% probiert und Das Datum bei mir auf den 16. umgestellt und den Skript laufen lassen und er erstellt keinen neuen Ordner mit dem neuen Datum. Dateien im Source Ordner hab ich natürlich geändert. Nur, wenn ich den Skript schließe und wieder öffne kopiert er den Ordner mit aktuellem Datum. Ich weiß nicht, wie man Date... aktualisieren lässt.

0
@Anonym01625

Ich selbst ärgere mich übrigens umgekehrt: Wenn ich von einem Stick etwas kopiere, dann steht da ständig das Kopierdatum dort (*Deinen Code mal sicher*).

Mir ist das ungewohnt, wie Du das tust.

Ich würde schreiben

cd dest\wohin_man_will

copy c:\was\was_und_wo_quelle

Was tut das?

In der guten alten Zeit, das batchten man frei von der Leber weg, doch die ist vorbei. Alles wurde anders intern. Ich bin jetzt immer mehr unterwegs in der PowerShell, die ich recht gelungen finde.

Oder aber Hardcore: Delphi und compilieren.

Wäre eines der drei für Dich ein Weg?

ps und: "md"

0
@Mauritan

Wenn du mir den Code dafür in Powershell gibst wäre schon nice. Danke!

0
@Anonym01625

So gut bin ich leider nicht, ich mache es zu selten. Ich könnte mich auch nur hinsetzen und programmieren, bis es klappt.

ob es md heisst oder mdir oder make dir oder makedir, - ich weiß es nicht. Doch die Hilfe schon.

Rufe Dir die Powershell auf, sie hat eine richtig gute Hilfe. Sowohl interaktiv, als auch von Handbüchern als auch via Internet.

Tip: Starte die Powershell als Admin.

0