【问题标题】:Use a scheduled task to move files into specific YY-MM folders based on file name使用计划任务根据文件名将文件移动到特定的 YY-MM 文件夹中
【发布时间】:2020-05-04 04:43:28
【问题描述】:

我正在尝试使用每晚运行的计划任务将数千个文件移动到 YYYY-MM 文件夹中。文件目前存储在这里:

C:\Users\USER\Desktop\New folder

我希望它们像这样存储:

C:\Users\USER\Desktop\New folder\YYYY\MM\

例如:

C:\Users\USER\Desktop\New folder\2019\05

如果 YYYY\MM 文件夹不存在,脚本将创建它们。文件名格式如下:

Status_20200116_001058.txt

所以对于上面的文件,YYYY 是 2020,MM 是 01

我在Stack上找到了一个PS脚本,修改成下面这样,但是之前没怎么用过PS,有点迷茫:

$Files_Folder = "C:\Users\USER\Desktop\New folder"
get-childitem | % {
    $file = $_.FullName
    $month = $date.month
    $year = $date.year

    new-item -type Directory -path "$Files_Folder\$year\$month"
    move-item $file "$Files_Folder\$year\$month"
}

运行上述导致 PS 在上面的位置创建一大堆文件夹和文件,我无法删除:

任何帮助将不胜感激

编辑:所以我尝试了来自@Wasif Hasan 的脚本,如下所示:

$Files_Folder = "C:\Users\USER\Desktop\New folder1"
get-childitem | % {
    $file = $_.FullName
    $month = $file.substring(12, 2)
    $year = $file.substring(8, 4)
    $folder = Join-Path -Path "$($Files_Folder)" -ChildPath "$($Year)"
    $folder = Join-Path -Path "$($folder)" -ChildPath "$($Month)"
    $Exists = Test-Path "$($Folder)"
    If (!$Exists) { New-Item -Type directory -Path "$($Folder)" }
   Move-Item "$($File)" "$($Folder)"
}

但是我在 PS 中遇到了一堆错误:

编辑:刚刚尝试了@Pavithran G 的脚本,修改为使用年份和月份变量而不是月份和日期:

$loc = "C:\Users\nazadmin\Desktop\New folder1"
$files = Get-ChildItem -Path $loc
for ($i=0; $i -lt $files.Count; $i++) 
{
$outfile = $files[$i].FullName
$filename = Split-Path -Path $outfile -Leaf -Resolve
$Year = $filename -replace "Status_\d{0}(\d{4})[\d_]*.txt",'$1'
$Month = $filename -replace "Status_\d{4}(\d{2})[\d_]*.txt",'$1'
$folder = Join-Path -Path  $loc -ChildPath $Year
$folder = Join-Path -Path $folder -ChildPath $Month
$Exists = Test-Path $folder
If (!$Exists) 
{ 
    New-Item -Type directory -Path $folder 
}
Move-Item $outfile $folder
}

这很好用!

编辑:刚刚意识到如果YY文件夹已经存在,那么脚本会尝试在YY文件夹中创建另一个YY文件夹,并抛出错误:

Move-Item : Access to the path 'C:\Users\USER\Desktop\New folder1\2018' is denied.
At line:14 char:10
+ Move-Item <<<<  $outfile $folder
+ CategoryInfo          : WriteError: (C:\Users\USER...ew folder1\2018:DirectoryInfo) [Move-Item], IOException
+ FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

有什么办法可以避免这种情况?

编辑:将发布一个新问题以使其更清晰 干杯

【问题讨论】:

  • 仅供参考,您不能在 Windows 中使用包含以下任何字符的文件名创建文件夹:` \ / : * ? " |`.所以你不能创建像 2019\05 这样的文件夹名称..你想要任何其他格式?
  • 那是文件夹路径,不是文件夹名称。所以路径转到文件夹 2019,然后是文件夹 05 - 基于文件名中的年份和月份

标签: powershell cmd scheduled-tasks


【解决方案1】:

$date 未声明为日期变量 (Get-Date)。使用 Join-Path 安全地创建路径并且您没有使用 Test-Path 检查文件夹是否存在。使用这个:

$date = Get-Date
$Files_Folder = "C:\Users\USER\Desktop\New folder"
get-childitem | % {
    $file = $_.FullName
    $month = $date.month
    $year = $date.year
    $folder = Join-Path -Path "$($Files_Folder)" -ChildPath "$($Year)"
    $folder = Join-Path -Path "$($folder)" -ChildPath "$($Month)"
    $Exists = Test-Path "$($Folder)"
    If (!$Exists) { New-Item -Type directory -Path "$($Folder)" }
   Move-Item "$($File)" "$($Folder)"
}

【讨论】:

  • 他要求一个像'2019\05'这样的文件夹名称作为同一个文件夹,而不是文件夹中的文件夹
  • 嗨@pavithranG 那是文件夹路径,而不是文件夹名称。我会对此进行测试并尽快回复
  • 嗨@Wasif Hasan $month 和 $year 变量需要基于文件名,而不是系统日期 - 请问这可能吗?所以 $year 是基于文件名中的第 8 到第 11 个字符,$month 是基于文件名中的第 12 到第 13 个字符
  • 其实刚刚想通了,要使用substring函数。我将对此进行测试并回复
  • 我在使用时遇到错误,请参阅主帖
【解决方案2】:

下面的脚本会根据里面的文件名创建文件夹。所以,不需要为计划任务添加,你可以随时运行,它会自动创建文件夹,但不要改变文件名的格式你之前提到过。

$loc = "C:\Users\USER\Desktop\New folder"
$files = Get-ChildItem -Path $loc
for ($i=0; $i -lt $files.Count; $i++) 
{
$outfile = $files[$i].FullName
$filename = Split-Path -Path $outfile -Leaf -Resolve
$Month = $filename -replace "Status_\d{4}(\d{2})[\d_]*.txt",'$1'
$date = $filename -replace "Status_\d{6}(\d{2})[\d_]*.txt",'$1'
$folder = Join-Path -Path  $loc -ChildPath $Month
$folder = Join-Path -Path $folder -ChildPath $date
$Exists = Test-Path $folder
If (!$Exists) 
{ 
    New-Item -Type directory -Path $folder 
}
Move-Item $outfile $folder
}

确保在管理员模式下运行 Powershell 脚本,因为有时它需要管理员权限才能移动或复制文件

【讨论】:

  • 感谢@pavithran G,我稍微修改了一下,添加了一个 $Year 变量,因为我将文件存储在 $Year 然后 $Month 文件夹中,我已将其添加到主帖子中跨度>
猜你喜欢
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多