Как перенести файлы в разные подпапки на основе имени файла - PullRequest
1 голос
/ 23 мая 2019

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

01_20190515_135255
02_20190515_135315
03_20190515_135317
04_20190515_135317

Мне нужен сценарий для перемещения их в определенные папки в зависимости от их канала

N:\Rover\CH1
N:\Rover\CH2
N:\Rover\CH3
N:\Rover\CH4

Другими словами, я хочу просто организовать их в соответствующую папку на моем NASместо хранения.У меня есть сценарий ниже этого работает для базовой передачи.Я думаю, что мне просто нужно небольшое дополнение к моему запросу, чтобы организовать их в хранилище NAS.

Get-ChildItem -Path "default path" -Recurse |
Where-Object {$_.LastWriteTime -lt (Get-date).AddDays(-31)} |
Move-Item -destination "destination"

Я много искал в Интернете и выяснил, что сценарий будет использовать регулярные выражения для такого рода процессов.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 23 мая 2019
$files = Get-ChildItem -Path "default path" -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-31) }

foreach ($file in $files)
{
    $channel     = ($file.BaseName -replace '^([0-9]+)_.*','$1').TrimStart("0")
    $destination = "N:\Rover\CH$channel"
    $file | Move-Item -destination $destination
}
0 голосов
/ 23 мая 2019

Изменение темы.

  • , так как Move-Item принимает ввод по трубопроводу
  • . Используйте оператор -match на основе RegEx с (группой захвата), чтобы сохранить первые две цифры вавтоматическая переменная $Matches[1],
  • создает -Destination в {script block} с использованием оператора формата -f.

## Q:\Test\2019\05\23\SO_56270164.ps1
$Source = "A:\Test"  # "X:\What\ever"
$Target = "A:\Rover" # "N:\Rover"
$DaysOld = (Get-date).Date.AddDays(-31)

Get-ChildItem -Path "$Source\[0-9][0-9]_*_*" -File -Recurse |
  Where-Object {($_.LastWritetime -lt $DaysOld) -and
                ($_.BaseName -match '^(\d{2})_\d{8}_\d{6}') } |
    Move-Item -Destination {'{0}\CH{1}' -f $Target,([int]$Matches[1]) } -WhatIf
# Remove -WhatIf if the output looks OK

Пример выполнения:

> gci A:\Test

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019-04-15     00:00              0 01_20190415_135255.ext
-a----       2019-05-15     00:00              0 01_20190515_135255.ext
-a----       2019-04-15     00:00              0 02_20190415_135315.ext
-a----       2019-05-15     00:00              0 02_20190515_135315.ext
-a----       2019-04-15     00:00              0 03_20190415_135317.ext
-a----       2019-05-15     00:00              0 03_20190515_135317.ext
-a----       2019-04-15     00:00              0 04_20190415_135317.ext
-a----       2019-05-15     00:00              0 04_20190515_135317.ext

> Q:\Test\2019\05\23\SO_56270164.ps1
> tree A:\ /F
A:\
├───Rover
│   ├───CH1
│   │       01_20190415_135255.ext
│   │
│   ├───CH2
│   │       02_20190415_135315.ext
│   │
│   ├───CH3
│   │       03_20190415_135317.ext
│   │
│   └───CH4
│           04_20190415_135317.ext
│
└───Test
        01_20190515_135255.ext
        02_20190515_135315.ext
        03_20190515_135317.ext
        04_20190515_135317.ext
0 голосов
/ 23 мая 2019
$DestinationPath = 'N:\Rover'

Get-ChildItem -Path "MyPath" -Recurse -File | Where-Object {$_.LastWriteTime -lt (Get-date).AddDays(-31)} | ForEach-Object {
    $Channel = ('CH' + $_.BaseName.Split("_")[0].TrimStart('0'))
    $DestinationFolder = Join-Path -Path $DestinationPath -ChildPath $Channel
    Move-Item -Path $_.FullName -Destination $DestinationFolder
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...