批量下载文件并一次运行多个文件?

时间:2019-01-08 16:14:07

标签: powershell batch-file

我正在尝试创建一个批处理文件,该文件可以一次下载并运行三个文件。其中两个是.bat文件,一个是.exe文件。我正在尝试在.bat文件中为此使用powershell命令,因为它需要可执行。我正在为此苦苦挣扎,因为我对批处理文件和powershell都不熟悉。

PowerShell.exe -Command "$url = "https://ufile.io/wqtvx""
PowerShell.exe -Command "$outpath = "$PSScriptRoot/downloadtest.bat""
PowerShell.exe -Command "Invoke-WebRequest -Uri $url -OutFile $outpath"
PowerShell.exe -Command "$wc = New-Object System.Net.WebClient"
PowerShell.exe -Command "$wc.DownloadFile($url, $outpath)"
PowerShell.exe -Command "$args = @("Comma","Separated","Arguments")"
PowerShell.exe -Command "Start-Process -Filepath "$PSScriptRoot/downloadtest.bat" -ArgumentList $args"

对于我要下载的每个文件,以上代码将重复三遍。我不太确定要在线下载的文件的存储位置,因此我将其上传到了免费的文件存储网站。如果有人可以帮助我完成这项工作,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

此脚本的主要问题是powershell.exe -c命令仅在powershell的一次迭代后才运行代码。一旦运行完代码,它就会“关闭”该Powershell窗口(试图解释得尽可能简单)。

Powershell可以在简单的命令行上链接命令,类似于批处理&符号,powershell可以完成此工作的;。此外,您的代码仍然无法像James C所述那样工作。-链接未直接指向文件,它要求您“单击”按钮来初始化下载。

不做广告,但我建议使用GitHub或MediaFire,因为您可以直接下载到每个文件的链接。无需在网页上进行javascript交互即可下载它们。


此脚本会将您的大多数命令放在一行上,从而允许从powershell下载。该特定命令将在1.0和1.0以上的Powershell上运行。简单的start Batchfile.bat会处理其余的工作,或者您可以通过添加; Start-Process -Filepath $PSScriptRoot/downloadtest.bat -ArgumentList exc ...

继续添加到命令中
Powershell.exe -Command "(New-Object Net.WebClient).DownloadFile('http://Site/Batchfile.bat', '%~dp0downloadtest.bat')"

答案 1 :(得分:1)

您将在每一行上启动一个单独的Powershell进程,因此每一行完全不受另一行的影响。这是行不通的,因为您要定义变量并在一行上为它们分配值,然后稍后再在没有此类变量的完全独立的过程中尝试使用它们。最简单的答案是按double-beep所述用分号分隔所有语句。

PowerShell.exe -Command "$url = 'https://ufile.io/wqtvx'; $outpath = '$PSScriptRoot/downloadtest.bat'; Invoke-WebRequest -Uri $url -OutFile $outpath; $wc = New-Object System.Net.WebClient; $wc.DownloadFile($url, $outpath); $args = @('Comma','Separated','Arguments'); Start-Process -Filepath '$PSScriptRoot/downloadtest.bat' -ArgumentList $args"

请注意您在代码中使用了引号。查看语法突出显示以了解第一行中发生的事情:

PowerShell.exe -Command "$url = "https://ufile.io/wqtvx""

Powershell会将您的命令解释为第一个字符串“ $ url =”,这将返回错误,因为它不是有效的Powershell语法。然后https://ufile.io/wqtvx不在引号内,Powershell将再次不知道如何解释该错误并引发错误。最后,将空字符串“”附加到末尾,这对语句没有任何意义。如上例所示,对引号内的引号使用单引号。

通常,这么多的代码对于一个班轮来说实在太多了。很难阅读和排除故障。我建议创建一个Powershell脚本,该脚本只是一个扩展名为.ps1的文本文件,并将其命名为“ DownloadFile.ps1”。在该文件中,输入以下代码:

$url = "https://ufile.io/wqtvx"
$outpath = "$PSScriptRoot/downloadtest.bat"
Invoke-WebRequest -Uri $url -OutFile $outpath
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $outpath)
$args = @("Comma","Separated","Arguments")
Start-Process -Filepath "$PSScriptRoot/downloadtest.bat" -ArgumentList $args

然后从批处理文件中调用该文件,例如:

Powershell.exe -ExecutionPolicy Bypass -Command "C:\Path\To\DownloadFile.ps1"

答案 2 :(得分:0)

每个powershell进程都是独立的,并且知道在另一个过程中做了什么,您需要将所有代码包含在单个-Command参数中,或者使用-File并将其传递给多行powershell脚本。

由于链接不是直接指向文件,因此下载也会失败,这需要您“单击”按钮来初始化下载。

因此,您将获得一个downloadtest.bat,其中包含下载页面本身的HTML源代码


一旦您的文件主机具有直接的URL链接,就可以在两个命令;Invoke-WebRequest之间使用分号Start-Process,使它们位于同一行:

PowerShell.exe -Command "Invoke-WebRequest -Uri https://filehost.com/directlink/downloadtest.bat -OutFile $PSScriptRoot/downloadtest.bat ; Start-Process -Filepath $PSScriptRoot/downloadtest.bat -ArgumentList @('Comma','Separated','Arguments')"