在 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 年前的帖子,但也许有人(像我一样)会发现它很有用。
在某个简单的地方创建一个小文件夹,例如“___Stage”,例如在您的照片或音乐存储的根目录下。
在桌面上某个单独的 [windows] 资源管理器小实例中打开该文件夹。使其视觉大小刚好足以容纳单个文件 - 我将其设置为大约 2 英寸见方,并将视图模式设置为大图标,使其足够大以便抓取而不会太准确。
将您的 internet/firefox/chrome/etc. 文件拖放到该文件夹的视图窗格中。
再次从此文件夹拖放到您想要的目标文件夹。这将被视为目录到目录的移动,这将解锁神奇的选项 #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.jpg
→x-1.jpg
- 如果这样的文件存在,则继续该行,
x-1.jpg
→x-2.jpg
→x-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."
}