Используйте запланированное задание для перемещения файлов в указанные c ГГ-ММ папки на основе имени файла - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь переместить тысячи файлов в папки 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

Я нашел сценарий 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 создает целую кучу папок и файлов в расположении выше, которое я не могу удалить:

enter image description here

Любая помощь будет наиболее ценной

Редактировать: Итак, я попробовал сценарий из @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:

enter image description here

Редактировать: Только что попробовал скрипт @Pavithran G, исправленный для используя переменную Year и Month вместо Month и Date:

$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

Любой способ избежать этой ситуации ation?

Редактировать: Опубликуем новый вопрос, чтобы сделать его понятнее Приветствия

Ответы [ 2 ]

1 голос
/ 20 января 2020

Ниже скрипт создаст папку на основе имени файла, присутствующего в этом. Так что, нет необходимости добавлять для запланированного задания, вы можете запустить в любое время, он автоматически создаст папку, но не изменит формат имени файла, который Вы упомянули ранее.

$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 запущен в режиме администратора, потому что иногда ему нужен доступ администратора для перемещения или копирования файла

0 голосов
/ 17 января 2020

$ 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)"
}
...