首页 > 解决方案 > 使用 for 循环将下载部分添加到 powershell 脚本

问题描述

我想构建一个下载一组特定文件的 powershell 脚本。这个集合会定期改变,所以for循环是更新进程的最干净的方式。

每个文件的 URL 每天都会更新日期和唯一的序列号,但我已经有一个流程来提取该信息并将其保存到文件中。我还有一种构建 PS 脚本以从此类 URL 下载特定文件的方法:

set /p file_info=<"<path to file with info>"
set file_dir=<known page directories>
set DL=C:\Users\%USERNAME%\Downloads\test.ps1

echo $url = "http://<domain>.com/%file_dir%/%file_info%" > "%DL%"
echo $output = "C:\Users\%USERNAME%\Downloads\%file_info%" >> "%DL%"
echo (New-Object System.Net.WebClient).DownloadFile($url, $output) >> "%DL%"

我还可以循环添加到 PS 脚本:

setlocal enabledelayedexpansion

set /p obj=<"<path to file with list of objects>"
set /p file_info=<"<path to file with info>"
set DL=C:\Users\%USERNAME%\Downloads\test.ps1

:: restarting PS script
echo #new > "%DL%"

for %%f in (%obj%) do (
set a=%%f
echo !a!!file_info! >> "!DL!"
)

但是,当我echo !a!!file_info! >> "!DL!"用第一个脚本中的echo行替换时(以相同的方式改编),PS 脚本不再使用循环内容更新(请注意,我现在使用 PS 用户名来避免任何延迟扩展的问题):

setlocal enabledelayedexpansion

set /p obj=<"<path to file with list of objects>"
set /p file_info=<"<path to file with info>"
set file_dir=<known page directories>
set DL=C:\Users\%USERNAME%\Downloads\test.ps1

:: restarting PS script
echo #new > "%DL%"

for %%f in (%obj%) do (
set a=%%f
echo $url = "http://<domain>.com/!file_dir!/!a!/!file_info!" >> "!DL!"
echo $output = "C:\Users\$env:UserName\Downloads\!file_info!" >> "!DL!"
echo (New-Object System.Net.WebClient).DownloadFile($url, $output) >> "!DL!"
)

::alternative that doesn't work either:

for %%f in (%obj%) do (
set a=%%f
call echo $url = "http://<domain>.com/!file_dir!/!a!/!file_info!" >> "!DL!"
call echo $output = "C:\Users\$env:UserName\Downloads\!file_info!" >> "!DL!"
call echo (New-Object System.Net.WebClient).DownloadFile($url, $output) >> "!DL!"
)

为什么使用for循环将 URL 下载部分添加到 PS 脚本时会出现问题?有没有办法避免这些问题?

标签: powershellfor-loopbatch-filedownloadecho

解决方案


您的代码的主要问题是您的echoed 右括号过早地关闭了for循环括号。在下面的示例中,我已经用插入符号逃脱了那些^.

例子:

@Echo Off
SetLocal EnableExtensions

Set /P "obj=" 0< "<path to file with list of objects>"
Set /P "file_info=" 0< "<path to file with info>"
Set "file_dir=<known page directories>"
Set "DL=C:\Users\%USERNAME%\Downloads\test.ps1"

(   For %%G In (%obj%) Do (
        Echo $url = "http://<domain>.com/%file_dir%/%%G/%file_info%"
        Echo $output = "C:\Users\$Env:UserName\Downloads\%file_info%"
        Echo (New-Object System.Net.WebClient^).DownloadFile($url, $output^)
    )
) 1> "%DL%"

推荐阅读