powershell 下载互联网文件使用批处理文件与重命名问题

ca1c2owp  于 11个月前  发布在  Shell
关注(0)|答案(2)|浏览(119)

我试图写一个批处理文件从互联网上下载不同的JPG文件。
路径格式为:“https:\abc.com\def\ghi.jpg\jklmno.pqrstuv.wxyz”。
我想用一个批处理文件从txt文件中下载jpg文件,这个txt文件中包含了几个url的jpg文件。
这是一个file.txt的例子,它保存了jpg文件的URL:

https:\\abc.com\def\ghi.jpg\jklmno.pqrstuv.wxyz
https:\\abc.com\def\ghi2.jpg-orig\jklmno.pqrstuv.wxyz
https:\\abc.com\def\ghi3.jpg\jklmno.pqrstuv.wxyz
https:\\abc.com\def\ghi4.jpg-orig\jklmno.pqrstuv.wxyz
https:\\abc.com\def\ghi5.jpg?jklmno.pqrstuv.wxyz
https:\\abc.com\def\ghi6

字符串
我尝试使用下面的编码.但它只下载了最后一个文件.这是我尝试:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /F %%x in (files.txt) do (
    powershell -Command "Invoke-WebRequest %%x -Outfile ghi.jpg"
)
echo "Done!"
cls
pause


我希望下载jpg文件,并在url中重命名为xxx.jpg(对于. jpg-orig也重命名为.jpg)。这是我所期望的:

Download **ghi.jpg** from *https:\\abc.com\def\ghi.jpg\jklmno.pqrstuv.wxyz*
Download **ghi2.jpg** from *https:\\abc.com\def\ghi2.jpg-orig\jklmno.pqrstuv.wxyz*
Download **ghi3.jpg** from *https:\\abc.com\def\ghi3.jpg\jklmno.pqrstuv.wxyz*
Download **ghi4.jpg** from *https:\\abc.com\def\ghi4.jpg-orig\jklmno.pqrstuv.wxyz*
Download **ghi5.jpg** from *https:\\abc.com\def\ghi5.jpg\jklmno.pqrstuv.wxyz*
Download **ghi6.jpg** from *https:\\abc.com\def\ghi6.jpg\jklmno.pqrstuv.wxyz*


我的想法是:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /F %%x in (files.txt) do (
    **[%%x is the url. AND I NEED TO RETRIEVE THE FILENAME(xxx.jpg) FROM THE URL]**
    powershell -Command "Invoke-WebRequest %%x -Outfile **[PUT THE RETRIEVED FILE NAME]**"
)
echo "Done!"
cls
pause


有什么想法吗?谢谢。
更新(26/11/2023):
感谢大家,在这里我得到了我的解决方案,我首先在第一个for循环中生成输出文件名并保存在LinkAndFileName.txt中。然后我用第二个for循环输出文件。
DownloadJPG.bat:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

break>LinkAndFileName.txt
for /f %%a In (Link.txt) do (
    for /f "delims=?" %%b In ("%%a") do (
        echo %%a %%b>>LinkAndFileName.txt
    )
)

for /F "tokens=1,2" %%x in (LinkAndFileName.txt) do (
    echo %%x
    echo %%~ny.jpg
    powershell -Command "Invoke-WebRequest '%%x' -Outfile 'Output\%%~ny.jpg'"
)

pause


LinkAndFileName.txt:

https:\\abc.com\def\ghi.jpg\jklmno.pqrstuv.wxyz https:\\abc.com\def\ghi.jpg
https:\\abc.com\def\ghi2.jpg-orig\jklmno.pqrstuv.wxyz https:\\abc.com\def\ghi2.jpg-orig
https:\\abc.com\def\ghi3.jpg\jklmno.pqrstuv.wxyz https:\\abc.com\def\ghi3.jpg
https:\\abc.com\def\ghi4.jpg-orig\jklmno.pqrstuv.wxyz https:\\abc.com\def\ghi4.jpg-orig
https:\\abc.com\def\ghi5.jpg?jklmno.pqrstuv.wxyz https:\\abc.com\def\ghi5.jpg
https:\\abc.com\def\ghi6 https:\\abc.com\def\ghi6


下载的JPG列表:

ghi.jpg from https:\\abc.com\def\ghi.jpg\jklmno.pqrstuv.wxyz 
ghi2.jpg from https:\\abc.com\def\ghi2.jpg-orig\jklmno.pqrstuv.wxyz
ghi3.jpg from https:\\abc.com\def\ghi3.jpg\jklmno.pqrstuv.wxyz
ghi4.jpg from https:\\abc.com\def\ghi4.jpg-orig\jklmno.pqrstuv.wxyz
ghi5.jpg from https:\\abc.com\def\ghi5.jpg?jklmno.pqrstuv.wxyz
ghi6.jpg from https:\\abc.com\def\ghi6

a2mppw5e

a2mppw5e1#

由于您没有更改目标文件ghi.jpg,因此最后下载的文件将覆盖所有以前的文件版本。

[未测试]

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a counter=0
for /F %%x in (files.txt) do (
    set /a counter+=1
    powershell -Command "Invoke-WebRequest %%x -Outfile ghi!counter!.jpg"
)
echo "Done!"

字符串
应该可以解决您的问题-除了它应该生成ghi1, ghi2...
如果你真的想用ghi代替ghi1

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a counter=0
for /F %%x in (files.txt) do (
    set /a counter+=1
    if !counter!==1 (powershell -Command "Invoke-WebRequest %%x -Outfile ghi.jpg"
    ) else (
     powershell -Command "Invoke-WebRequest %%x -Outfile ghi!counter!.jpg"
    )
)
echo "Done!"


请不要尝试在代码示例中应用文本效果-*是一个重要字符。

aij0ehis

aij0ehis2#

正如评论中所指出的:

  • 考虑将整个批处理文件实现为PowerShell脚本。与cmd.exe(批处理文件)相比,PowerShell具有非常上级的功能,并且不必混合这两种非常不同的shell的不同语法,从而简化了事情。
  • 如果切换到PowerShell脚本(从PowerShell会话执行的*.ps1文件)不是一个选项,请避免在循环中调用Windows PowerShell CLI(powershell.exe),因为每次调用都需要很高的性能。

下面的解决方案使用 * 单个 * powershell.exe调用:

  • 它使PowerShell本身逐行读取包含URL的输入文件。
  • ...并使用PowerShell的文本解析运算符从每个URL派生输出文件名:
@echo off
setlocal

powershell -Command "Get-Content file.txt | ForEach { $outFile = ($_ -split '[\\/]')[-2] -replace '-.+$'; Invoke-WebRequest $_ -OutFile $outFile }"

echo Done!

字符串
另请参阅以下有关上面使用的PowerShell小工具和运算符的帮助主题:

相关问题