-2

ドキュメントへの 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
4

2 に答える 2

3

他のタイプの引数と比較して、Powershell で引数の配列を渡すことに違いはありません。やり方はこちらをご覧ください。テキスト ファイルがあることを考えると、引数の配列を渡す必要はなく、ファイル名のみを渡す必要があるため、文字列のみを渡す必要があります。

私はあなたが使用しているものである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   
}

つまり、1 つのファイルをすべて 1 か所にまとめて、コンテンツを正しく受信できるようにします。はすでにページのコンテンツを取得しているためStart-BitsTransfer、なぜ必要なのかわかりません。Invoke-WebRequestで何もしていないことに注意してください。その$savedPagesため、私のコードは実質的に役に立ちません。

その後、の内容が$URLFileファイルに入り、その呼び出しを次のように置き換えます

gc "Path_To_Your_File"`

それでも機能する場合は、次のようにスクリプトにパラメーターを導入し$Pathます。

param([string]$Path)

再テストなど。Powershell を初めて使用する場合は、常に小さなコード部分から始めて、必要なすべての機能を含めるように成長を続けてください。大きな作品から始めると、決して完成しない可能性があります。

于 2012-10-27T19:18:48.873 に答える
1

パラメータの処理に関するNeoliskからのリンクでこれを理解しました。次に、最後にいくつかのコードを変更して、別の変数を作成し、通常どおりに処理しました。パラメータを渡すこととの混乱だけです。

## 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
于 2012-10-27T21:07:38.237 に答える