为了写一篇论文,我尝试通过 API 反复下载 XML。必须每隔一小时或三小时下载一次,持续很长一段时间。
我发现了几种可以一次性下载某些内容的方法,例如使用 PowerShell:
powershell.Exe -command "& {$client = new-object System.Net.WebClient;$client.DownloadFile('http://exampleapi.uk?key=examplekey','C:\location\APIcall.xml')}"
但是,是否可以设置动态文件名,以便每次下载都会获得新名称,并且文件不会被覆盖?理想情况下,它们会在名称中获得时间戳,但只要没有数据被覆盖,我就很高兴了。
注意:我是一名 GIS 学生,有一些 SQL 和 C++ 经验,但没有高级经验。我不能使用需要花费数小时学习才能理解是否可以做到的答案,例如 libcurl 或 gnuwin,我只需要解决这个问题并继续使用数据进行地图项目。
答案1
DownloadFile()
您可以在调用该方法之前轻松创建文件路径和文件名Join-Path
。
就像是
powershell.exe -command "& {$fileOut = Join-Path -Path 'C:\location' -ChildPath ('APIcall_{0:yyyy-MM-dd HH_mm_ss}.xml' -f (Get-Date))
$client = new-object System.Net.WebClient
$client.DownloadFile('http://exampleapi.uk?key=examplekey', $fileOut)}"
在这里我使用-f
格式运算符转换日期时间目的从Get-Date
时间戳细绳 {0:yyyy-MM-dd HH_mm_ss}
当然,您可以以不同的格式设置日期,但请确保它不包含无效的文件名字符,如:
、/
或\
答案2
获取日期将返回当前数据和时间作为约会时间类型。有多种预定义或者风俗您可以应用的格式。
下面是使用格式运算符的预定义“s”(可排序)格式的示例-f
:
$BaseName = 'MyBaseName'
$ThisRunName = '{0}_{1:s}' -f $BaseName , ( Get-Date )
$ThisRunName
输出:
PS C:\> $BaseName = 'MyBaseName'
>> $ThisRunName = '{0}_{1:s}' -f $BaseName , ( Get-Date )
>> $ThisRunName
MyBaseName_2021-05-05T13:01:30
PS C:\>\
视力很差——甚至没有注意到可排序格式中的冒号(文件名中非法)。这是一个使用自定义格式字符串的更好的示例。从时间中删除秒数,正如 OP 所说的那样,每隔几个小时:
$BaseName = 'MyBaseName'
$ThisRunName = '{0}_{1:yyMMdd_HHmm}' -f $BaseName , ( Get-Date )
$ThisRunName
输出:
PS C:\> $BaseName = 'MyBaseName'
>> $ThisRunName = '{0}_{1:yyMMdd_HHmm}' -f $BaseName , ( Get-Date )
>> $ThisRunName
MyBaseName_210505_2239
PS C:\>