【发布时间】:2017-08-17 22:47:02
【问题描述】:
我正在尝试获取一个脚本,它将 iis 日志和超过 1 天的存档从我的实例移动到 S3 存储桶(例如日志)。 S3 路径:logs/iislogs/instance-ID/W3SVC1、/W3SVC2 等
Import-Module 'C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1'
$bucket='logs'
$source="c:\inetpub\logs\LogFiles"
$wc = New-Object System.Net.WebClient;
$instanceIdResult = $wc.DownloadString("http://IP/latest/meta-data/instance-id")
foreach ($i in Get-ChildItem $source)
{
if ($i.CreationTime -lt ($(Get-Date).AddDays(-1)))
{
Write-S3Object -BucketName $bucket -File $i.FullName -Key iislogs/$instanceIdResult/$i
}
}
结果我得到了错误:
Write-S3Object : FilePath 属性指示的文件不存在! 在行:12 字符:15 + Write-S3Object
同样在 S3 中:logs/iislogs/instance-ID/ 所有从子文件夹复制的文件。
请帮忙
经过一些研究,我能够将超过 1 天的日志文件复制到 S3,然后从源 PC 中删除它们。但是 S3 存储桶路径包含 ...\c:\inetpub\logs\LogFiles 的问题。如何剪切并复制到logs/iislogs/instance-ID/W3SVC1、/W3SVC2?
Import-Module 'C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1'
$bucket='logs'
$source="c:\inetpub\logs\LogFiles\*"
$wc = New-Object System.Net.WebClient;
$instanceIdResult = $wc.DownloadString("http://IP/latest/meta-data/instance-id")
foreach ($i in Get-ChildItem $source -include *.txt -recurse)
{
if ($i.CreationTime -lt ($(Get-Date).AddDays(-1)))
{
Write-S3Object -BucketName $bucket -Key iislogs/$instanceIdResult/$i -File $i
}
}
Get-ChildItem -Path $source -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt ($(Get-Date).AddDays(-1))} | Remove-Item -Force
【问题讨论】:
-
可能是因为您的 Get-ChildItem 正在返回目录和文件?你能改成(Get-ChildItem $source | where {$_.PsIsContainer})。也可以试试 ($i.FullName)。
-
PowerShell 3.0 及更高版本在
Get-ChildItem上也有-File和-Directory参数。 -
感谢赛义德的建议。如果我将 Get-ChildItem $source -recurse 替换为 Get-ChildItem $source -recurse |其中 {$_.PsIsContainer} 脚本不起作用 - 什么也没发生。 Write-S3Object ... -Key iislogs/$instanceIdResult/$i.FullName 将文件名更改为 ...log.FullName
标签: powershell amazon-web-services