PowerShell移动文件时为文件名追加日期以避免覆盖的实现方法
PowerShell移动文件时为文件名追加日期以避免覆盖的实现方法
嗨,作为PowerShell新手遇到这种文件覆盖的问题太正常啦,我来帮你把脚本改一改,完美实现你要的功能!
首先先理清楚你的需求:把同名的PDF文件移动到对应的同名文件夹里,同时给每个PDF加上创建日期后缀,这样就不会出现覆盖或者报错的情况了对吧?
咱们来一步步调整你的脚本:
核心思路
- 提取每个PDF文件的创建日期,格式化成你需要的
MM_dd_yyyy(两位月份_两位日期_四位年份)形式 - 把原文件名和日期后缀拼接成新的文件名
- 确保目标文件夹存在(哪怕之前没有也能自动创建)
- 把文件移动到目标文件夹的新路径下
完整修改后的脚本
$folder = 'V:\Files' Set-Location $folder # 遍历目录下所有PDF文件 Get-ChildItem *.pdf | ForEach-Object { # 获取文件创建日期,格式化为MM_dd_yyyy的后缀 $dateSuffix = $_.CreationTime.ToString('MM_dd_yyyy') # 生成带日期后缀的新文件名 $newFileName = "$($_.BaseName)_$dateSuffix.pdf" # 组合目标路径:同名文件夹 + 新文件名 $destinationPath = Join-Path -Path $_.BaseName -ChildPath $newFileName # 检查目标文件夹是否存在,不存在则自动创建 if (-not (Test-Path -Path $_.BaseName -PathType Container)) { New-Item -Path $_.BaseName -ItemType Directory -Force | Out-Null } # 移动文件到目标路径 Move-Item -Path $_.FullName -Destination $destinationPath }
脚本细节解释
$_.CreationTime.ToString('MM_dd_yyyy'):$_代表当前正在处理的PDF文件,CreationTime是它的创建时间,用ToString把时间转成你需要的格式,比如5/1/2023会变成05_01_2023$newFileName = "$($_.BaseName)_$dateSuffix.pdf":BaseName是文件的名字(不带.pdf后缀),拼接后就能得到像123456789_05_01_2023.pdf这样的新文件名Join-Path:这个命令是PowerShell里安全拼接路径的方式,避免手动写斜杠出现错误,比如会自动拼成123456789\123456789_05_01_2023.pdfTest-Path和New-Item:这部分是做兜底的,万一目标文件夹还没创建,会自动帮你建出来,避免移动文件时报错Move-Item:最后把原文件移到新的目标路径,因为每个文件的日期后缀不一样,完全不用担心覆盖问题啦
小调整提示
如果你不想用创建日期,而是想用文件的最后修改日期,只需要把$_.CreationTime改成$_.LastWriteTime就可以啦,根据你的实际需求调整就行。
备注:内容来源于stack exchange,提问作者SpecialK78




