Powershell - 如何移动名为“yyyy-mm-dd”的文件夹

时间:2015-03-06 08:37:11

标签: powershell

我想通过PowerShell脚本每天移动文件夹。这些文件夹以" 2013-09-11"的形式命名。等等 文件夹可能包含多个文件,我想将它们从网络共享移动到另一个文件。

$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将foldername与上述模型进行比较?

编辑:此外,是否有一种在给定时间每天运行此脚本的好方法?

EDIT2:我还想根据名字中的年份将文件夹放在子文件夹中。所以文件夹" 2013-09-11"应移至" G:\ Destination \ 2013"以及其他一切相应的。如果尚未创建年份文件夹,则应创建该文件夹。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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}是量词。

答案 1 :(得分: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
    }

这将从源获取文件夹,如果目标中没有此类文件夹,则创建具有年份的文件夹。然后它会将其复制到目标文件夹并删除源的内容。我选择复制文件是因为您无法自动覆盖文件夹。