好的,所以,这是我最初编辑的原始答案。感谢@Matt指出我应该对我的回答更具描述性,并清楚地解释我的编辑内容,以便其他用户可以从我的答案中获益。像@Matt这样的用户是这个社区的重要组成部分,并强调在这里保持高标准。
我编辑/添加的第一件事是能够从每次运行中删除以前的日志。由于将安排此脚本,因此必须删除以前的日志以防止占用过多的磁盘空间。这可以在评论中注明:“从prev run中删除日志文件”
# delete log files from prev Run
Remove-Item C:\alerts\logs\*.*
我编辑/添加的下一件事是能够在主机名之间切换。我这样做是为了防止覆盖文件。您可以在注释“更改文件名以防止覆盖日志文件”下看到此内容。我通过检查foreach循环中的“$ url”索引来完成此操作,并检查它是否位于我需要更改主机名的位置。我怀疑有一种更直观的方式来做这件事,我会喜欢它,如果有人用更好的方式来做这件事,因为它让我疯狂,我不知道更好的方法。应该注意的是,我正在下载总共44个网址,因此我更改了主机名的神奇数字(11,22,33)。再说一遍,如果你知道更好的方法,请不要犹豫,让我知道。
If ($urls.IndexOf($url) -eq 11){
$currentDir = "goxsd1704"
}
ElseIf ($urls.IndexOf($url) -eq 22){
$currentDir = "goxsd1705"
}
ElseIf ($urls.IndexOf($url) -eq 33){
$currentDir = "goxsd1706"
}
我编辑/添加的下一件事,感谢@Matt推荐的是try catch块,这些块在代码中清楚地注明。在我假设脚本总是能够工作之前,我应该从没有这些开始。新秀的错误和观点。有了这些,这些都是我的编辑。代码工作正常,但总是可以改进。感谢您的时间和答案。
# set date
$date = Get-Date -UFormat "%Y-%m-%d-%H_EST"
# delete log files from prev Run
Remove-Item C:\alerts\logs\*.*
# setup download links
$urls = "http://subdomain.domain.com:portnumber/LogA/API_DBG_CS_Logs/dbg_a.$date.log"
function DownloadFMOSLogs()
{
try
{
# assign working dir to currentDir
$currentDir = "goxsd1703"
# instantiate web-client.
$wc = New-Object System.Net.WebClient
# loop through each url
foreach ($url in $urls)
{
# change filename to prevent overwriting of log file
If ($urls.IndexOf($url) -eq 11){
$currentDir = "goxsd1704"
}
ElseIf ($urls.IndexOf($url) -eq 22){
$currentDir = "goxsd1705"
}
ElseIf ($urls.IndexOf($url) -eq 33){
$currentDir = "goxsd1706"
}
# get file name
$fileName = $url.SubString($url.LastIndexOf('/')+1)
# create target file name
$targetFileName = "C:\alerts\logs\" + $currentDir + "_" + $fileName
$wc.DownloadFile($url, $targetFileName)
Write-Host "Downloaded $url to file location $targetFileName"
}
} catch [System.Net.WebException],[System.IO.IOException]
{
"An error occurred. Files were not downloaded."
}
}
DownloadFMOSLogs
Write-Host ""
Write-Host "Download of application log files has successfully completed!"
答案 0 :(得分:0)
Invoke-WebRequest
是Powershell中下载文件的好方法,OutFile
参数会将此直接放到磁盘上,文档为here。
使用Invoke-WebRequest -Uri $link -OutFile $targetFileName
答案 1 :(得分:0)
你有两个问题和一两个问题。
$urls
不是您认为的数组。它实际上是一整个字符串。尝试这样的事情:
$urls = "http://subdomain.domain.com:port/LogA/API_DBG_CS_Logs/dbg_a.$date.log",
"http://subdomain.domain.com:port/LogA/API_DBG_CS_Logs/dbg_b.$date.log"
该变量将在该字符串中扩展正常。之前的问题是,由于操作的顺序,您从第一部分开始连接字符串。将数组添加到左侧的字符串时,数组将转换为空格分隔的字符串。看一个较小的例子,这正是你试图做的。
"hello" + 2,2 + "there"
如果先将每个人用一组括号包起来,你本可以做出你的工作。
("hello" + 2),(2 + "there")
此代码在其他地方可能有意义,但正如其他人指出的那样,你对文件中的行有一个无用的循环。 foreach($line in Get-Content .\hosts.txt)
。如果你不使用它摆脱它。
您并没有真正充分发挥$targetDir
的潜力。如果要使用脚本的工作目录,请至少使用一些绝对路径。另请注意,评论与正在发生的事情并不完全匹配,这可能与2.上面的
# preprend host to file name to keep file names diff.
$targetFilePath = [io.path]::combine($pwd,"test.txt")
# download the files.
$wc.DownloadFile($link, $targetFilePath)
您应该尝试以某种方式使其独特,因为文件将在您编码时相互覆盖。
如果下载失败,我还会将其包装在try块中,您可以正确报告。截至目前,您认为它每次都会有效。