2015-03-06 4 views
0

Я хочу ежедневно перемещать папки с помощью сценария PowerShell. Папки называются в форме «2013-09-11» и т. Д. Папки могут содержать несколько файлов, и я хочу переместить их из общего сетевого ресурса в другой.Powershell - Как переместить папки с именем «yyyy-mm-dd»

$SourceDir = "H:\Source\" 
$DestinationDir = "G:\Destination\" 
$dir = dir $SourceDir | ?{$_.PSISContainer} 

foreach ($d in $dir | where-object {$_.Directory.Name -like "YYYY-MM-DD"}) 
{ 
    ForEach-Object{Move-Item $_ $DestinationDir} 
} 

Как сообщить PowerShell о сравнении имени папки с вышеупомянутой моделью?

EDIT: Кроме того, есть ли хороший способ запускать этот скрипт каждый день в определенный момент времени?

EDIT2: Я также хотел бы поместить папки в подпапки в зависимости от года в их именах. Поэтому папка «2013-09-11» должна быть перенесена в «G: \ Destination \ 2013» и все остальное соответственно. Если папка года еще не создана, она должна быть создана. Как я могу это достичь?

+0

мое текущее решение: http://pastebin.com/sGUR2x0h добавляет папки. Но, к сожалению, 2013, 20132013, 201320132013 и т. Д. – Zoba

ответ

1

Вы могли бы попробовать это таким образом:

$SourceDir = "SourceDir" 
$DestinationDir = "DestDir" 
$dir = dir $SourceDir | ?{$_.PSISContainer} 

$dir | ? {$_.Name -match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'} | % { 
    $source = $SourceDir +$_ 
    Move-Item $source $DestinationDir 
    } 

'^ [0-9] {4} - [0-9] {2} - [0-9] {2} $' является регулярное выражение, которое соответствует только шаблону, упомянутому выше.^- начало строки, $ - конец строки. [0-9] означает, что допускаются только числа, {n} - квантификатор.

+0

, который работает и только собирает папки, которые имеют необходимый формат. Но разве нет возможности использовать что-то вроде функции Date.Format? – Zoba

0

Хорошо, я получил мой ответ сейчас:

$SourceDir = "H:\Source\" 
$DestinationDir = "G:\Destination\" 
$dir = dir $SourceDir | ?{$_.PSISContainer} 
$dir | ? {$_.Name -match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'} | % { 
    $pastePath = "" 
    $yearDir = $_.Name.substring(0,4) 
    $pastePath = $DestinationDir + $yearDir 
    if (-not (Test-Path $pastePath) -and ($yearDir.length -eq 4)) 
    { 
     md $pastePath 
    } 
    $source = $SourceDir + $_ 
    cp -Recurse $Source $pastePath -Force 
    rm $Source -Recurse -Force -Confirm: $false 
    } 

это получит папку из источника и создать папку с годом, если нет такой папки в пункте назначения. Затем он скопирует его в целевую папку и удалит содержимое источника. Я решил скопировать файлы, потому что вы не можете автоматически перезаписывать папки.

Смежные вопросы