2012-07-19 139 views
0

我正在使用PS脚本将5个最新文件按源文件类型从源目录移动到目标目录,同时保留子文件夹结构。例如,我想将任何以AB_开头的文件从ParentFolder1 \ FolderA,ParentFolder1 \ FolderB,ParentFolder1 \ FolderC等移动到ParentFolder2 \ FolderA,ParentFolder2 \ FolderB,ParentFolder2 \ FolderC。PowerShell - 将特定文件从源子文件夹移动到具有相同子文件夹结构的目标

ParentFolder1

--FolderA

---- AB_1234.txt

---- AB_5678.txt

---- XY_9876.txt

- --- XY_9876.txt

- 文件夹B

---- AB_1234.txt

---- AB_5678.txt

---- XY_9876.txt

---- XY_9876.txt

--FolderC

---- AB_1234.txt

---- AB_5678.txt

---- XY_9876.txt

---- XY_9876.txt

有没有一种方法,以配合成这样的循环?这是我到目前为止:

$source = "C:\Test" 
$dest = "E:\archive" 
$AB = Get-ChildItem -Path $source -include AB_* -Recurse | Where-Object {-not $_.PsIsContainer} 
$XY = Get-ChildItem -Path $source -include XY_* -Recurse | Where-Object {-not $_.PsIsContainer} 
$keep = 5 
$logfile = "E:\_archive\temp\log_{0:MM-dd-yyyy}.log" -f (Get-Date) 

if ($AB.Count -gt $keep) { 
    $AB | Sort -property LastWriteTime | Select-Object -First ($AB.Count - $keep) | Move-Item -destination $dest\AB -Force -Verbose 
    } 
Else 
    {"No AB_ files to archive." | Out-File $LogFile -Append -Force} 

if ($XY.Count -gt $keep) { 
    $XY | Sort -property LastWriteTime | Select-Object -First ($XY.Count - $keep) | Move-Item -destination $dest\XY -Force -Verbose 
    } 
Else 
    {"No XY_ files to archive." | Out-File $LogFile -Append -Force} 

回答

0

你可能会更好使用Robocopy

+0

我没有使用xcopy或robocopy的主要原因是我找不到一种方法来保留最新的5个文件并移动其余的文件。 Robocopy有没有办法做到这一点? – user1539274 2012-07-20 20:36:22

+0

对不起,我没注意到最新的5个文件。 – Neil 2012-07-20 23:21:29

2
function Move-Newest-Files 
{ 
    param (
     [parameter(Mandatory = $true)] [string] $source, 
     [parameter(Mandatory = $true)] [string] $destination, 
     [parameter(Mandatory = $true)] [array] $filter, 
     [parameter(Mandatory = $false)][int] $keep = 5 
    ) 

    try 
    { 
     $source = Resolve-Path $source 

     $list = Get-ChildItem -Path $source -Include $filter -Recurse -Force | 
      Where-Object { -not $_.psIsContainer } | 
      Sort-Object -property LastWriteTime -descending | 
      Select-Object -First $keep 

     foreach ($file in $list) 
     { 
      $destfile = $file -replace [regex]::Escape($source), $destination 
      $destpath = Split-Path $destfile -Parent 

      if (!(Test-Path $destpath)) 
       { $null = New-Item -ItemType Container -Path $destpath } 

      Move-Item $file -Force -Destination $destfile 
     } 
    } 

    catch 
    { 
     Write-Host "$($MyInvocation.InvocationName): $_" 
    } 
} 

Move-Newest-Files . "D:\xyzzy" @("*.cs", "*.txt", "*.exe") 10 
+0

谢谢大卫。你能为我定义$ filter和$ file变量吗? – user1539274 2012-07-20 21:25:55

+0

$ filter是一个数组,其文件扩展名为要保留的文件:类似于@(“* .cs”,“* .txt”,“* .exe”)或这个@(“*。*” ) – 2012-07-21 08:41:55

相关问题