【发布时间】: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