磁盘上有德语格式的文件夹:“ 01.05.2019”,我想将其转换为英语格式的格式:“ 2019-05-01”。
我正在使用PowerShell。是否有执行此操作的功能?还是应该获取所有子字符串并重新排序?
目前,我只收集字符串:
$OrgDir = "P:\Fotos\Import"
$folders = Get-ChildItem $($OrgDir) -Directory
foreach ($dir in $folders) {
Write-Host "folder: " $dir
}
答案 0 :(得分:4)
使用[DateTime]::ParseExact()
可以避免日期解析器混淆月份和日期:
$OrgDir = "P:\Fotos\Import"
$folders = Get-ChildItem $OrgDir -Directory
foreach ($dir in $folders) {
Write-Host "folder: $([DateTime]::ParseExact($dir.Name, "dd.MM.yyyy", $null).ToString("yyyy-MM-dd"))"
}
上面显示了转换后的名称。为了有效地重命名文件,我建议这样做:
Get-ChildItem $OrgDir -Directory |
ForEach-Object {
$_ | Rename-Item -NewName (
[DateTime]::ParseExact($_.Name, "dd.MM.yyyy", $null).ToString("yyyy-MM-dd")
)
}
PowerShell这一行将$OrgDir
中的所有目录重命名为新的日期格式,假设文件夹中的所有目录都以此方式命名。
正如@Matt Johnson指出的那样,$null
使用您的系统默认区域性来表示ParseExact(string, format, culture)
(以及ToString(format, culture)
)。根据您的系统当前具有哪种文化设置,这可能会或不会导致问题。
为确保这些设置不会干扰此功能,请在[System.Globalization.CultureInfo]::InvariantCulture
和ParseExact()
中将ToString()
用作区域性参数。
答案 1 :(得分:2)
Matt Johnson在他的评论中提供了重要的指示:
要编写健壮的代码,使其独立于有效的文化而起作用,,请明确指定文化上下文 ,同时:
将字符串解析为[datetime]
实例
将[datetime]
实例格式化为字符串
因此,请根据您的情况使用以下内容:
PS> [datetime]::Parse('01.05.2019', [cultureinfo] 'de-DE').
ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture)
2019-05-01
由于01.05.2019
是德语中有效的(第一天)短日期,因此无需自定义解析,只需de-DE
(德语/德国)作为文化背景。
.ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture)
指定一个显式的输出格式字符串; [cultureinfo]::InvariantCulture
-不变的文化(基于美式英语)-文化背景可确保根据公历对日期进行解释。
请注意,在PowerShell中,广播(例如[datetime] '01.05.2019'
)和字符串插值(例如"$(get-date)"
)总是使用不变文化-而在没有显式文化(格式提供者)参数的情况下调用[datetime]::Parse()
和.ToString()
则使用 current 文化。 >
答案 2 :(得分:0)
最后,这对我有用:
PS> [datetime]::Parse('01.05.2019', [cultureinfo] 'de-DE').
ToString('yyyy-MM-dd', [cultureinfo]::InvariantCulture)
所有其他解决方案均以以下方式结束:
Get-Date:无法绑定参数“ Date”。无法将值“ 15.12.2019”转换为类型“ System.DateTime”。错误:“无法将字符串识别为有效的DateTime。”
非常感谢mklement0。