如何使用powershell

时间:2018-02-09 21:25:57

标签: powershell

好的,所以,这是我最初编辑的原始答案。感谢@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!"

2 个答案:

答案 0 :(得分:0)

Invoke-WebRequest是Powershell中下载文件的好方法,OutFile参数会将此直接放到磁盘上,文档为here

使用Invoke-WebRequest -Uri $link -OutFile $targetFileName

答案 1 :(得分:0)

你有两个问题和一两个问题。

  1. $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")
    
  2. 此代码在其他地方可能有意义,但正如其他人指出的那样,你对文件中的行有一个无用的循环。 foreach($line in Get-Content .\hosts.txt)。如果你不使用它摆脱它。

  3. 您并没有真正充分发挥$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块中,您可以正确报告。截至目前,您认为它每次都会有效。