bruno8500
Goto Top

CMD neueste geschriebene Datei umbenennen

Abend,
Ich habe einen Ordner in denen ich Replays von Games abspeichere. Diese werden aber mit einem ziemlich Aussagelosem Titel gespeichert (z.B. Replay_2020.06.20-20.37).
Anstelle des "Replay" soll dort der Name des aktuellen Spiels stehen (also der aktuellen Vollbildanwendung).

Also soll die Batch die neueste, geschriebene Datei mit den Namen des aktuellen Spiels umbennen. Dabei sollen aber nur Dateien umbenannt werden die während der Batch erstellt wurden (damit nicht einfach die neueste Datei umbenannt wird sobald ich die Batch starte).

Ich habe eine loop gefunden die die neuste geschriebene Datei einfach die neueste Datei anzeigt:
for /f %%i in ('dir /b/a-d/od/t:c') do set LAST=%%i  
echo The most recently created file is %LAST%

Wie krieg ich es hin damit die Batch nur Dateien berücksichtigt die während des Batch Prozesses geschrieben wurden?
Und wie krieg ich den Namen der aktuellsten Vollbildanwendung heraus?

Gruß,
Bruno

Content-ID: 580869

Url: https://administrator.de/forum/cmd-neueste-geschriebene-datei-umbenennen-580869.html

Ausgedruckt am: 05.04.2025 um 14:04 Uhr

rubberman
Lösung rubberman 21.06.2020 um 22:15:50 Uhr
Goto Top
Keine Chance so etwas mit Batch zu erledigen.

Proof of concept für PowerShell:
$c=Add-Type -Name pInv -PassThru -MemberDefinition @'  
[DllImport("user32.dll")]  
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]  
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint processId);
[DllImport("shell32.dll")]  
public static extern int SHQueryUserNotificationState(ref int state);
'@  

function Wait-ForFullScreenProc {
  $state=0
  do {
    sleep -m 10
    $hresult=$c::SHQueryUserNotificationState([ref]$state)
  } until (-not $hresult -and ($state -in 2..4))
}

function global:Get-FullScreenProcName {
  $procid=[UInt32]0
  $state=0
  $hresult=$c::SHQueryUserNotificationState([ref]$state)
  if (-not $hresult -and ($state -in 2..4)) {
    do {
      $null=$c::GetWindowThreadProcessId($c::GetForegroundWindow(), [ref]$procid)
      $fname=(gps -Id $procid -FVI -EA SilentlyContinue).FileName
    } until ($fname)
    return ((gi $fname).BaseName)
  }
  return "unknown"  
}

Wait-ForFullScreenProc

$watcher=New-Object System.IO.FileSystemWatcher
$watcher.Path=Split-Path -parent $MyInvocation.MyCommand.Definition
$watcher.IncludeSubdirectories=$false
$watcher.EnableRaisingEvents=$true

$null=Register-ObjectEvent $watcher "Created" -Action {  
  if ($Event.SourceEventArgs.Name.StartsWith("Replay_")) {  
    ren -Path $Event.SourceEventArgs.FullPath -NewName ($Event.SourceEventArgs.Name -replace "^Replay", (global:Get-FullScreenProcName))  
  }
}

while ($true) {sleep 1}
Die PowerShell Profis können es aber vermutlich besser als ich.

Steffen
Bruno8500
Bruno8500 21.06.2020 um 22:49:50 Uhr
Goto Top
Danke! Das ist genau was ich wollte face-smile