Поместите все файлы xls в подкаталоги и переместите их в папку в зависимости от даты создания файла.

У меня есть папка, содержащая вложенные папки, каждая из которых содержит множество электронных таблиц Excel. Я пытаюсь заставить powershell искать в подкаталогах, а затем перемещать все файлы xls с той же датой создания в новую папку с этой датой создания. Я близко, я думаю, вот мой код. Происходит то, что он просматривает только файл в «отчетности», а не подпапки «отчетности».

Get-ChildItem "c:\users\username\documents\reporting\*.xls" -Recurse | foreach {
$x = $_.LastWriteTime.ToShortDateString()
$new_folder_name = Get-Date $x -Format yyyy.MM.dd
$des_path = "c:\users\username\documents\$new_folder_name"

if (test-path $des_path){
   move-item $_.fullname $des_path
   } else {
   new-item -ItemType directory -Path $des_path
   move-item $_.fullname $des_path
   }
}

person Lord Beerus    schedule 22.11.2019    source источник


Ответы (1)


Нет необходимости сначала использовать ToShortDateString() для свойства LastWriteTime, а затем использовать его для воссоздания даты для ее форматирования.

Поскольку вы также используете переключатель -Recurse для поиска во вложенных папках, код можно настроить и на параметр -Include, например:

$sourcePath = 'c:\users\username\documents\reporting'
$targetPath = 'c:\users\username\documents'
Get-ChildItem $sourcePath -Include '*.xls', '*.xlsx' -File -Recurse | ForEach-Object {
    $des_path = Join-Path -Path $targetPath -ChildPath ('{0:yyyy.MM.dd}' -f $_.LastWriteTime)
    if (!(Test-Path -Path $des_path -PathType Container)) {
        # if the destination folder does not exist, create it
        $null = New-Item -Path $des_path -ItemType Directory
    }
    $_ | Move-Item -Destination $des_path -Force -WhatIf
}

Переключатель -WhatIf в конце Move-Item предназначен для тестирования. Как только вы будете удовлетворены текстом, отображаемым в консоли, снимите этот переключатель, чтобы фактически начать перемещение файлов.

person Theo    schedule 23.11.2019