Параметры PowerShell 3

Привет В основном у меня проблема, мне нужно загрузить аргументы в следующий код, расположенный на $URL & $Output но мне нужно, чтобы он работал с Join-Path но каждый раз, когда я пытаюсь это сделать, я получаю кучу ошибок, я новичок в этом, поэтому я пытаюсь сделать все, чтобы это заработало. Мой босс просил меня сделать это изо всех сил, но я никогда не уклонялся от этого. вызов

Function DownloadFileFromURL
{
Add-Type -AssemblyName Microsoft.Visualbasic
#$url = 'http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe'
$url = $args[0]
$filename = Split-Path -leaf $url
$output = Join-Path $args1 + $filename
$response = [System.Net.WebRequest]::Create($url).GetResponse()
$realurl = $response.ResponseUri.OriginalString
$response.Close()
(New-Object Net.WebClient).DownloadFile($url, $output)


#################Time Taken To Download Files###################### 
$start_time = Get-Date
Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

}

    DownloadFileFromURL ('http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe','C:\Users\Martin.beardmore\Downloads\test')

Получаемые ошибки

Join-Path : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\Martin.beardmore\Documents\Query download.ps1:6 char:21
+ $output = Join-Path $args[1] + $filename
+                     ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Join-Path], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.JoinPathCommand

Cannot convert argument "requestUri", with value: "System.Object[]", for "Create" to type "System.Uri": "Cannot convert the "System.Object[]" value of type "System.Object[]" to type 
"System.Uri"."
At C:\Users\Martin.beardmore\Documents\Query download.ps1:7 char:1
+ $response = [System.Net.WebRequest]::Create($url).GetResponse()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

You cannot call a method on a null-valued expression.
At C:\Users\Martin.beardmore\Documents\Query download.ps1:9 char:1
+ $response.Close()
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Cannot convert argument "address", with value: "System.Object[]", for "DownloadFile" to type "System.Uri": "Cannot convert the "System.Object[]" value of type "System.Object[]" to type 
"System.Uri"."
At C:\Users\Martin.beardmore\Documents\Query download.ps1:10 char:1
+ (New-Object Net.WebClient).DownloadFile($url, $output)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

1 ответ

Вы должны удалить + между путями, которые вы хотите присоединиться. Посмотрите на синтаксис для Join-Path,

PS> Get-Command Join-Path -Syntax

Join-Path [-Path] <string[]> [-ChildPath] <string> [-Resolve] [-Credential <pscredential>] [-UseTransaction] [<CommonParameters>]

Вы должны использовать это как $output = Join-Path $args1 $filename

Кроме того, где $args1 родом из? В функциях вы должны назвать свои параметры. Порядок, в котором вы их определяете, будет тем порядком, с которым они связаны, поэтому они будут вести себя так же, как аргументы, но с ними легче работать.

Function DownloadFileFromURL ($url, $folder)
{
    Write-Host "URL: $url"
    Write-Host "Folder: $folder"
}

Образец:

PS > DownloadFileFromURL stackru.com c:\folder
URL: stackru.com
Folder: c:\folder

Вы также неправильно вызываете функцию. Запятая используется для разделения объектов в массиве, поэтому DownloadFileFromURL ('http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe','C:\Users\Martin.beardmore\Downloads\test') результаты в:

$url = $args[0] = @('http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe','C:\Users\Martin.beardmore\Downloads\test')

Измените вашу функцию, чтобы использовать параметры, и назовите ее, как я, как показано выше, и она должна работать.

Обновленный скрипт:

Function DownloadFileFromURL ($url, $destination)
{
    Add-Type -AssemblyName Microsoft.Visualbasic
    $filename = Split-Path -Leaf $url
    $output = Join-Path $destination $filename
    $response = [System.Net.WebRequest]::Create($url).GetResponse()
    $realurl = $response.ResponseUri.OriginalString
    $response.Close()
    (New-Object Net.WebClient).DownloadFile($url, $output)


    #################Time Taken To Download Files###################### 
    $start_time = Get-Date
    Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

}

DownloadFileFromURL 'http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe' 'C:\Users\Martin.beardmore\Downloads\test'
#or even better
#DownloadFileFromURL -url 'http://download.microsoft.com/download/F/4/2/F42AB12D-C935-4E65-9D98-4E56F9ACBC8E/wpilauncher.exe' -destination 'C:\Users\Martin.beardmore\Downloads\test'
Другие вопросы по тегам