powershell - 使用 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 脚本时会出现问题?有没有办法避免这些问题?
解决方案
您的代码的主要问题是您的echo
ed 右括号过早地关闭了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%"
推荐阅读
- reactjs - 如何在 React 中按升序对过滤器下拉列表中的 UniqueValues 进行排序
- excel - 子名称上的 VBA“无效限定符”错误
- javascript - Fİrebase 文档参考路径未获取数据
- abap - 遮蔽同名全局变量的局部声明
- javascript - moment js 从不完整的时间字符串中减少一个小时
- reactjs - 如何在手动创建的 React 应用程序中使用谷歌字体?
- r - 如何让我的回归模型结果以 R Shiny 输出?
- sql - 在子查询中加入 CASE 语句的语法错误
- api - 用户数据通过图形 API 发送到 facebook,无需编码或加密。这是正确的方法吗?
- speech-to-text - 浏览器应用程序中 JavaScript SDK 中的 Microsoft Azure 语音转文本行为