Powershell 批量文件下载并逐个运行多个文件?

Powershell 批量文件下载并逐个运行多个文件?,powershell,batch-file,Powershell,Batch File,我正在尝试创建一个批处理文件,可以一次下载并运行三个文件。其中两个是.bat文件,一个是.exe文件。我正在尝试在.bat文件中使用powershell命令,因为它需要可执行。我正在努力解决这个问题,因为我不熟悉批处理文件和powershell PowerShell.exe -Command "$url = "https://ufile.io/wqtvx"" PowerShell.exe -Command "$outpath = "$PSScriptRoot/downloadtest.bat""

我正在尝试创建一个批处理文件,可以一次下载并运行三个文件。其中两个是.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"

对于我想下载的每个文件,上面的代码将重复三次。我不太确定在哪里存储我想在线下载的文件,所以我把它上传到了一个免费的文件存储网站。如果有人能帮我完成这项工作,我将不胜感激。

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

你的下载也会失败,因为链接不是直接指向文件的,它需要你“点击”一个按钮来初始化下载

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


一旦您拥有一个带有直接URL链接的filehost,就可以使用分号
在两个命令
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')"

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

Powershell能够在简单的命令行上链接命令,类似于批处理
&
符号,Powershell具有
用于此作业。此外,您的代码仍然无法像James C所说的那样工作-链接不是直接指向文件的,它要求您“单击”按钮以初始化下载

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


此脚本将把大多数命令放在一行上,从而允许从powershell下载。此特定命令将适用于所有vs 1.0+的PowerShell。一个简单的
start Batchfile.bat将处理其余部分,或者您可以通过添加
继续添加到命令中;启动进程-文件路径$PSScriptRoot/downloadtest.bat-ArgumentList exc

Powershell.exe -Command "(New-Object Net.WebClient).DownloadFile('http://Site/Batchfile.bat', '%~dp0downloadtest.bat')"

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

请注意,您在代码中误用了引号。查看突出显示的语法,了解第一行中发生了什么:

PowerShell.exe -Command "$url = "https://ufile.io/wqtvx""
Powershell将把您的命令解释为第一个字符串“$url=”,该字符串将返回错误,因为它不是有效的Powershell语法。然后在任何引用之外,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"

您正在启动单独的powershell进程。每个变量中定义的变量都将丢失。请您为我更正代码,以便我可以比较并尝试了解问题?请选中以
分隔的Add命令。此外,当尝试访问该链接时,下载失败。不确定目标文件存储在哪里…感谢您的建议!将使用Github:)这很有效,谢谢!如何指定保存下载文件的路径?@Mike将
'%~dp0downloadtest.bat'
更改为所需的路径。这是前路。
%~dp0
只是批处理文件的位置。PS:如果这是一个解决方案,请使用绿色复选标记,以便其他人知道!祝您好运。“%$dp0downloadtest.bat”严格来说是名称,不能用作目录。可以-谢谢。@Mike Yes路径可以是
C:\downloadtest.bat
C:\folder\batch.bat
或其他路径。只要确保你把名字和它一起放在最后。祝你好运!不幸的是,这需要一个文件,做一切,但感谢所有的信息!肯定会有帮助,并会让你随时了解我的进展。
Powershell.exe -ExecutionPolicy Bypass -Command "C:\Path\To\DownloadFile.ps1"