将一组URL作为参数传递给Powershell

时间:2012-10-27 18:02:51

标签: parameter-passing powershell-v3.0

我正在尝试编写一个脚本,该脚本将包含一个文本文件,其中包含指向文档的URL链接并下载它们。我很难理解如何传递参数并在powershell中操作它们。这是我到目前为止所得到的。我想我应该使用参数的param方法,所以我可以为脚本要求它,但$ args在面值上看起来更容易......一点帮助将非常感激。 **更新

$script = ($MyInvocation.MyCommand.Name)
$scriptName = ($MyInvocation.MyCommand.Name -replace "(.ps1)" , "")
$scriptPath = ($MyInvocation.MyCommand.Definition)
$scriptDirectory = ($scriptPath.Replace("$script" , ""))

## ##################################
## begin code for directory creation.
## ##################################

## creates a direcory based on the name of the script.
do {
    $scriptFolderTestPath = Test-Path $scriptDirectory\$scriptName -PathType container
    $scriptDocumentFolderTestPath = Test-Path $scriptFolder\$scriptName"_Script_Documents" -PathType container
    $scriptLogFolderTestPath = Test-Path $scriptFolder\$scriptName"_Script_Logs" -PathType container

    if ($scriptFolderTestPath -match "False") { 
        $scriptFolder = New-Item $scriptDirectory\$scriptName -ItemType directory
    }
    elseif ($scriptDocumentFolderTestPath -match "False") {
        New-Item $scriptFolder\$scriptName"_Script_Documents" -ItemType directory       
    }
    elseif ($scriptLogFolderTestPath -match "False") {
        New-Item $scriptFolder\$scriptName"_Script_Logs" -ItemType directory
    }
} Until (($scriptFolderTestPath -match "True") -and ($scriptDocumentFolderTestPath -match "True") -and ($scriptLogFolderTestPath -match "True"))

## variables for downloading and renaming code.
$date = (Get-Date -Format yyyy-MM-dd)

## ################################
## begin code for link downloading.
## ################################

## gets contents of the arguement variable.
Get-Content $linkList

## downloads the linked file.
Invoke-WebRequest $linkList

产生的错误

PS C:\Windows\system32> C:\Users\Steve\Desktop\Website_Download.ps1
cmdlet Website_Download.ps1 at command pipeline position 1
Supply values for the following parameters:
linkList: C:\Users\Steve\Desktop\linkList.txt


    Directory: C:\Users\Steve\Desktop\Website_Download


Mode                LastWriteTime     Length Name                                                                                     
----                -------------     ------ ----                                                                                     
d----        10/27/2012   3:59 PM            Website_Download_Script_Documents                                                        
d----        10/27/2012   3:59 PM            Website_Download_Script_Logs                                                             
Get-Content : Cannot find path 'C:\Users\Steve\Desktop\linkList.txt' because it does not exist.
At C:\Users\Steve\Desktop\Website_Download.ps1:42 char:1
+ Get-Content $linkList
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\Steve\Desktop\linkList.txt:String) [Get-Content], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Invoke-WebRequest : Could not find file 'C:\Users\Steve\Desktop\linkList.txt'.
At C:\Users\Steve\Desktop\Website_Download.ps1:45 char:1
+ Invoke-WebRequest $linkList
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.FileWebRequest:FileWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

2 个答案:

答案 0 :(得分:3)

与其他任何类型的参数相比,在Powershell中传递参数数组没有区别。 See here了解它是如何完成的。考虑到你有一个文本文件,你不需要传递一个参数数组,只需要传递一个文件名,所以只需要一个字符串。

我没有使用Powershell 3.0的经验,这是你正在使用的(根据代码中Invoke-WebRequest的存在来判断),但我会从这样的事情开始:

$URLFile = @"
http://www.google.ca
http://www.google.com
http://www.google.co.uk/
"@

$URLs = $URLFile -split "`n";
$savedPages = @();
foreach ($url in $URLs) {
    $savedPages += Invoke-WebRequest $url   
}

也就是说,您只需一个文件,并确保正确收到您的内容。不确定为什么需要Start-BitsTransfer,因为Invoke-WebRequest已经为您提供了网页内容。请注意,我没有对$savedPages执行任何操作,因此我的代码实际上没用。

之后,$URLFile的内容会进入文件,并用

替换对它的调用
gc "Path_To_Your_File"`

如果仍然有效,请在脚本中引入$Path参数,如下所示:

param([string]$Path)

再次测试,依此类推。如果您是Powershell的新手,请始终从较小的代码片开始,并不断发展以包含您需要的所有功能。如果你从大片开始,你很可能永远不会完成。

答案 1 :(得分:1)

通过Neolisk关于处理params的链接来解决这个问题。然后在最后更改了一些代码以创建另一个变量并像往常一样处理事情。只是对传递参数感到困惑。

## parameter passed to the script.
param (
    [parameter(Position=0 , Mandatory=$true)]
    [string]$linkList
)

## variables for dynamic naming.
$script = ($MyInvocation.MyCommand.Name)
$scriptName = ($MyInvocation.MyCommand.Name -replace "(.ps1)" , "")
$scriptPath = ($MyInvocation.MyCommand.Definition)
$scriptDirectory = ($scriptPath.Replace("$script" , ""))

## ##################################
## begin code for directory creation.
## ##################################

## creates a direcory based on the name of the script.
do {
    $scriptFolderTestPath = Test-Path $scriptDirectory\$scriptName -PathType container
    $scriptDocumentFolderTestPath = Test-Path $scriptFolder\$scriptName"_Script_Documents" -PathType container
    $scriptLogFolderTestPath = Test-Path $scriptFolder\$scriptName"_Script_Logs" -PathType container

    if ($scriptFolderTestPath -match "False") { 
        $scriptFolder = New-Item $scriptDirectory\$scriptName -ItemType directory
    }
    elseif ($scriptDocumentFolderTestPath -match "False") {
        New-Item $scriptFolder\$scriptName"_Script_Documents" -ItemType directory       
    }
    elseif ($scriptLogFolderTestPath -match "False") {
        New-Item $scriptFolder\$scriptName"_Script_Logs" -ItemType directory
    }
} Until (($scriptFolderTestPath -match "True") -and ($scriptDocumentFolderTestPath -match "True") -and ($scriptLogFolderTestPath -match "True"))

## variables for downloading and renaming code.
$date = (Get-Date -Format yyyy-MM-dd)

## ################################
## begin code for link downloading.
## ################################

## gets contents of the arguement variable.
$webTargets = Get-Content $linkList

## downloads the linked file.
Invoke-WebRequest $webTargets