在 Powershell 中,是否可以定义每次运行命令时都会改变的文件名?

在 Powershell 中,是否可以定义每次运行命令时都会改变的文件名?

为了写一篇论文,我尝试通过 API 反复下载 XML。必须每隔一小时或三小时下载一次,持续很长一段时间。

我发现了几种可以一次性下载某些内容的方法,例如使用 PowerShell:

powershell.Exe -command "& {$client = new-object System.Net.WebClient;$client.DownloadFile('http://exampleapi.uk?key=examplekey','C:\location\APIcall.xml')}"

我从在 Windows 7 中定期从 Web 下载文件

但是,是否可以设置动态文件名,以便每次下载都会获得新名称,并且文件不会被覆盖?理想情况下,它们会在名称中获得时间戳,但只要没有数据被覆盖,我就很高兴了。

注意:我是一名 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:\>

相关内容