我有一个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)
答案 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