Powershell复制文件和文件夹

时间:2015-06-01 12:45:15

标签: powershell

我有一个PS脚本,它会压缩前几个月的日志并命名zip文件C:\Folder1\ C:\Folder1\Folder2\ C:\Folder1\Folder3\ C:\Folder1\Folder4\Folder5\

这有效

我现在要做的是将这些zip文件复制到网络共享,但保留一些文件夹结构。我目前的文件夹结构类似于以下内容;

c:\Folder1

c:\folder1下方的每个文件夹中都有.zip文件 我想要的是脚本将文件从\\networkshare复制到folder4但保留文件夹结构,所以我应该在c:\folder1\...中有3个文件夹和另一个子文件夹。

目前我只能复制整个结构,所以我在\\networkshare

中得到-recurse

我一直遇到新文件夹结构不存在的问题,我无法在Get-ChildItem命令中使用#This returns the date and formats it for you set value after AddMonths to set archive date -1 = last month $LastWriteMonth = (Get-Date).AddMonths(-3).ToString('MM') #Set destination for Zip Files $DestinationLoc = "\\networkshare\LogArchive\$env:computername" #Source files $SourceFiles = Get-ChildItem C:\Sourcefiles\*.zip -Recurse | where-object {$_.lastwritetime.month -le $LastWriteMonth} Copy-Item $SourceFiles -Destination $DestinationLoc\ZipFiles\ Remove-Item $SourceFiles 开关等等。

我到目前为止的脚本是

Declare @sql varchar(max) = ''
set @sql = 'SELECT RotaDate,  DateDay, SlotTypeID, SlotDescription AS Hours,'

select @sql = @sql + ' 
' + 'max(case when ChaplainName = '''+ChaplainName+''' then AvailabilityDescription end) '+LEFT(ChaplainName, CHARINDEX(' ', ChaplainName+ ' ') - 1)+' ,'
FROM Chaplaincy_Chaplains

SET @sql = LEFT(@sql, LEN(@sql) - 1)

SET @sql = @sql + ' ' +
    '
    FROM Chaplaincy_Rota,Chaplaincy_Availability, Chaplaincy_Chaplains, Chaplaincy_Dates, Chaplaincy_Faiths, Chaplaincy_SlotTypes
    WHERE
    RotaDate = Chaplaincy_Dates.Date AND
    RotaSlot = SlotTypeID AND
    RotaChaplain = ChaplainID AND
    RotaAvailability = AvailabilityID AND
    ChaplainFaith = Chaplaincy_Faiths.FaithID
    GROUP BY RotaDate, SlotTypeID, SlotDescription, DateDay
    ORDER BY RotaDate, SlotTypeID;'

Print @sql
EXEC (@sql)

2 个答案:

答案 0 :(得分:2)

有时候,你不能(轻松地)使用纯粹的PowerShell"解。这是其中一次,没关系。

Robocopy将镜像目录结构,包括任何空目录,并选择您的文件(可能比使用get-childitem的过滤器更快)。您可以复制超过90天(约3个月)的任何内容:

robocopy C:\SourceFiles "\\networkshare\LogArchive\$($env:computername)\ZipFiles" /E /IS /MINAGE:90 *.zip

如果必须准确,您也可以使用/MINAGE指定实际日期。

答案 1 :(得分:1)

Copy-Item "C:\SourceFiles\" -dest $DestinationLoc\ZipFiles -container -recurse怎么样?我测试了这个并发现它完整地复制了文件夹结构。如果您只需要*.zip个文件,则先获取这些文件,然后为每个文件call Resolve-Path with -Relative flag set获取,然后将结果路径添加到Destination参数中。

$oldloc=get-location
Set-Location "C:\SourceFiles\" # required for relative
$SourceFiles = Get-ChildItem C:\Sourcefiles\*.zip -Recurse | where-object {$_.lastwritetime.month -le $LastWriteMonth}
$SourceFiles | % { 
    $p=Resolve-Path $_.fullname -relative
    copy-item $_ -destination "$DestinationLoc\ZipFiles\$p"
}
set-location $oldloc # return back