异步观察者

异步观察者

在 Windows 上,如何设置一种机制,以便当我将文件移动到已经存在同名文件的目录中时,新文件会随机重命名(或重命名为 <>.ext)?

用例:我正在浏览 cheezburger,将图像拖放到文件夹中。问题:它们都命名为 i.chzbgr.jpg => 冲突。Windows 提供替换或不移动,甚至不自动重命名...

答案1

虽然不是一个完美的解决方案,但我找到并修改了一个脚本,该脚本监视文件夹中的新文件,当它检测到新文件时,它会自动用随机数重命名它。复制粘贴以下内容并将其保存为 .ps1 文件。从 powershell 控制台或 cmd 运行它。(确保启用 ps 脚本的运行)。

$folder = 'Q:\Test\# Downloads'  # <-- Change as desired
$filter = '*.*'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $false        
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 #$changeType = $Event.SourceEventArgs.ChangeType
 #$timeStamp = $Event.TimeGenerated
 if( $name -imatch "stop")
 {
    Unregister-Event -SourceIdentifier FileCreated;
    write-host "Monitoring stopped.";
    Exit(0);
 }
 else
 {
    $count=$(Get-Random -minimum 1 -maximum 999999);
    $p = Split-Path "$path" -Parent;
    $newName = "$p\$count-$name"
    while(test-path $newName)
    {
        $count=$(Get-Random -minimum 1 -maximum 999999);
        $newName = "$p\$count-$name";
    }
    Move-Item $path -Destination $newName -Force -Verbose
 }
}

将名为“stop”的文件添加到文件夹即可停止监控。

答案2

我知道这是一个 3 年前的帖子,但也许有人(像我一样)会发现它很有用。

  1. 在某个简单的地方创建一个小文件夹,例如“___Stage”,例如在您的照片或音乐存储的根目录下。

  2. 在桌面上某个单独的 [windows] 资源管理器小实例中打开该文件夹。使其视觉大小刚好足以容纳单个文件 - 我将其设置为大约 2 英寸见方,并将视图模式设置为大图标,使其足够大以便抓取而不会太准确。

  3. 将您的 internet/firefox/chrome/etc. 文件拖放到该文件夹​​的视图窗格中。

  4. 再次从此文件夹拖放到您想要的目标文件夹。这将被视为目录到目录的移动,这将解锁神奇的选项 #3“移动新文件并附加 (x) 以重命名并保留两个文件”

中提琴。

我尝试过上面的操作将其拖到桌面,但是这样文件仍然会在桌面上,除非你按住 Shift 键(或者如果你有一个以这种方式设置的多键鼠标,则按住 Shift 鼠标按钮)来取消“+”由于某种原因,win7 认为桌面不同于目录。

我知道这很笨拙,但你永远不必将手从鼠标上移开,或者找出命名冲突并正确地重命名它。

如果您无法忍受 01.jpg、01(1).jpg、01(2).jpg,则必须分别重命名它们。我无法理解为什么 win7 从 COPY 选项中删除了 #3 选项功能,却将其包含在 MOVE 选项中。

答案3

异步观察者

  • 开始于.\watch.ps1,结束于CtrlC
  • 监听当前文件夹
  • 监听Created事件。我也尝试添加Renamed ,但由于各种原因失败了。
  • 附加到-1文件后面,x.jpgx-1.jpg
  • 如果这样的文件存在,则继续该行,x-1.jpgx-2.jpgx-3.jpg
watch.ps1
# Made by Qwerty https://superuser.com/questions/600550/autorename-files-with-identical-names-when-dropping-in-directory/1658155#1658155
# Inspired by https://powershell.one/tricks/filesystem/filesystemwatcher

# Run this script by '.\watch.ps1' to start watching current folder.
# Stop by pressing Ctrl+C

try {
  $watcher = New-Object IO.FileSystemWatcher -Property @{
    Path = '.'
    Filter = '*.*'
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
  }

  $action = {
    $details = $Event.SourceEventArgs
    $Path = $details.FullPath
    $Name = $details.Name
    $OldName = $details.OldName
    $filename = [io.path]::GetFileNameWithoutExtension($Name)
    $ext = [io.path]::GetExtension($Name)

    if ( $OldName -eq $null ) {
      $count = 0
      do {
        $count = $count + 1
        $newName = "$filename-$count$ext"
      } while ( test-path $newName )
      Move-Item $Path -Destination $newName -Force
      Write-Host ""
      Write-Host "$Name -> $newName" -ForegroundColor DarkYellow
    }
  }

  $handlers = . { # available event types: Created Deleted Changed Renamed
    Register-ObjectEvent -InputObject $watcher -EventName Created  -Action $action
  }

  # Monitoring starts now:
  $watcher.EnableRaisingEvents = $true
  Write-Host "Watching for changes. Press Ctrl+C to stop."

  # Use an endless loop to keep PowerShell busy.
  do {
    Wait-Event -Timeout 1
    Write-Host "." -NoNewline # write a dot to indicate we are still monitoring
  } while ($true)
} finally {
  # This gets executed when user presses CTRL+C:

  $watcher.EnableRaisingEvents = $false
  $handlers | ForEach-Object { Unregister-Event -SourceIdentifier $_.Name }
  $handlers | Remove-Job
  $watcher.Dispose()

  Write-Host ""
  Write-Host "Event Handler disabled, watching ends."
}

相关内容