我有一个包含所有文件类型的文件夹,例如:
10November2017.txt
01October1986.txt
20September2000.dat
13February1992.txt
我使用PowerShell运行以下2个任务:
以“yyyyMMdd.txt”格式重命名所有返回的.txt文件,例如:
我能够完成任务1,但有点在任务2中挣扎。 请你帮忙吗?
提前致谢
答案 0 :(得分:6)
使用DateTime.ParseExact()
method根据BaseName
属性(没有扩展名的文件名)解析日期,然后将其转换回所需格式的字符串。
使用MMMM
说明符
$txtFiles = Get-ChildItem .\path\to\files -Filter *.txt
foreach($file in $txtFiles){
try{
$fileDate = [datetime]::ParseExact($file.BaseName,'ddMMMMyyyy',$null)
$file |Rename-Item -NewName ('{0:yyyyMMdd}{1}' -f $fileDate,$file.Extension)
}
catch {
Write-Warning "File base name $($file.BaseName) not recognized as valid date"
}
}
答案 1 :(得分:1)
这是一个班轮:
gci -File *.txt|where BaseName -match '^(\d{2})(\w{3,9})(\d{4})$'|Ren -NewName {$matches[3]+([DateTime]::ParseExact($matches[2],"MMMM",$CIUS).Month.ToString('00'))+$matches[1]+$_.Extension} -Whatif
如果输出看起来没问题,请删除尾随-whatif
如果您的区域设置不符合要匹配的月份名称,则不能将$null
与ParseExact一起使用,但必须定义不同的区域性变量:
$CIUS = New-Object system.globalization.cultureinfo("en-US")
并用该变量替换$null
。
较长的变体
$CIUS = New-Object system.globalization.cultureinfo("en-US")
Get-ChildItem -File *.txt|
Where-Object BaseName -match '^(\d{2})(\w{3,9})(\d{4})$'|
Rename-Item -NewName {$matches[3]+`
([DateTime]::ParseExact($matches[2],"MMMM",$CIUS).Month.ToString('00'))+`
$matches[1]+`
$_.Extension"} -Whatif
有解释
^
和结束$
,并从日,月名和年份构建三个组。$matches
的组如果你需要反转这个(使用不同的语言环境),例如8月的法语名称:
PS> $CIFR = New-Object system.globalization.cultureinfo("fr-FR")
PS> $CIFR.DateTimeFormat.MonthNames[8 -1]
août
获取cultureinfo
项目列表:
[System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures)
答案 2 :(得分:1)
我建议使用另一种单线解决方案,可能会更短一点:
Get-ChildItem -Filter "*.txt" -Recurse | Where-Object {$_.BaseName -match "\D"} | Rename-Item -NewName {[datetime]::ParseExact($_.Basename, "ddMMMMyyyy", $null).ToString("yyyyMMdd") + $_.extension}
说明
-Filter "*.txt"
仅过滤文字文件
-Recurse | Where-Object {$_.BaseName -match "\D"}
仅对包含非数字字符的对象进行迭代,以便过滤掉新重命名的项目
[datetime]::ParseExact($_.Basename, "ddMMMMyyyy", $null)
将文件名(无扩展名)转换为日期对象
.ToString("yyyyMMdd") + $_.extension
将日期对象转换为所需的字符串表示形式并附加扩展名