我有很多半小時一次的檔案,名稱格式為A_B_C_YYYYMMDDThhmm_YYYYMMDDThhnn.csv
A、B 和 C 是單詞,其中YYYY4 位數的年份,
MM2 位數的月份,2 位數的月份日期,
DD一天中
hh的小時2 dgits,
mm2 位數的分鐘,nnmm 30 分鐘
如何使用 Powershell 根據年份和月份將這些檔案移動到檔案夾中?
我根據以前使用的腳本進行了嘗試,但它沒有為我的檔案名格式生成任何輸出,大概是因為match字串錯誤:
Push-Location 'path/to/files'
Get-ChildItem _*_*.csv |
Where-Object {$_.BaseName -match '_(\d{4})(\d{2})T(\d{4})_\d{6}T(\d{4})'} | ForEach-Object {
$TargetDir = "{0}\{1}" -f $Matches[1],$Matches[2]
if (!(Test-Path $TargetDir)){MD $TargetDir | Out-Null}
$_ | Move -Destination $TargetDir
}
uj5u.com熱心網友回復:
乍一看,正如您所推測的,您的正則運算式模式與您的檔案名不匹配。我稍微改變了模式,并使用[datetime]::ParsedExact(..)它來提取年份和月份。以前沒有測驗過,但我相信它應該可以作業。
不用說,這段代碼沒有處理檔案沖突,如果有一個檔案與被移動到目標的檔案之一同名,這將失敗。
Push-Location 'path/to/files'
Get-ChildItem -Filter _*_*.csv | ForEach-Object {
if($_.BaseName -match '(?:\w_){3}(\d{8})T\d{4}_\1T\d{4}') {
$parsed = [datetime]::ParseExact(
$Matches[1], 'yyyyMMdd', [cultureinfo]::InvariantCulture
)
$folder = '{0:0000}\{1:00}' -f $parsed.Year, $parsed.Month
$path = Join-Path $PWD.Path -ChildPath $folder
if(-not (Test-Path $path)) {
$null = New-Item $path -ItemType Directory
}
Move-Item -LiteralPath $_.FullName -Destination $path
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434556.html
上一篇:執行緒“AWT-EventQueue-0”中的Java例外java.lang.NumberFormatException:對于輸入字串:“”
下一篇:如何在運算式中使用cmdlet
