我试图写一个批处理文件从互联网上下载不同的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
型
2条答案
按热度按时间a2mppw5e1#
由于您没有更改目标文件
ghi.jpg
,因此最后下载的文件将覆盖所有以前的文件版本。[未测试]
字符串
应该可以解决您的问题-除了它应该生成
ghi1, ghi2...
如果你真的想用
ghi
代替ghi1
,型
请不要尝试在代码示例中应用文本效果-
*
是一个重要字符。aij0ehis2#
正如评论中所指出的:
cmd.exe
(批处理文件)相比,PowerShell具有非常上级的功能,并且不必混合这两种非常不同的shell的不同语法,从而简化了事情。*.ps1
文件)不是一个选项,请避免在循环中调用Windows PowerShell CLI(powershell.exe
),因为每次调用都需要很高的性能。下面的解决方案使用 * 单个 *
powershell.exe
调用:字符串
另请参阅以下有关上面使用的PowerShell小工具和运算符的帮助主题:
Get-Content
ForEach-Object
的-split
,string splitting operator-replace
,基于正则表达式的字符串替换运算符Invoke-WebRequest
的