2017-05-04 75 views
0

我想完成一個腳本,將允許循環通過文件夾和文件。Powershell提取年份和月份從字符串

  1. 該腳本將導入一個文件並從文件中提取名稱和編號。
  2. 使用通過C:\Temp文件夾的名稱循環來查找該名稱。
  3. 列出該文件夾下的所有文件並提取年份和月份。該文件看起來像下面和腳本從文件名中提取201705和轉換05個月到May AAA_123456789_201705021541_AAAAAA.pdf
  4. 然後腳本需要是MayJuneJuly等任何文件,並通過創建一個將它們發送到不同的文件夾使用導入文件中的數字的文件夾。例如,如果文件名有05,那麼文件夾X00000000MAY2017和文件可能被移動到該文件夾​​。

到目前爲止已經得到了下面的腳本。我能夠導入文件提取信息,並通過它循環,但卡住部分從文件名中提取月份和年份,並將它們放入變量中。

$data = Import-Csv -Path C:\temp\test.txt -Header "Number","Name" -Delimiter "|" 
$Name = $data.Name 

foreach ($cxName in $Name) { 
    $cxName = Get-ChildItem C:\temp\$cxName 

    ForEach ($item in $cxName) { 
     If ($item -match "(?<year>\d\d\d\d)(?<mon>\d\d)") { 
      "$item's date is $($Matches.Year)" 
     } Else { 
      "$item failed to match" 
     } 
    } 
} 
+0

你怎麼知道其中的日期將是在該文件名字符串?我對步驟4的工作方式也有點失落。那麼匹配的日期將有一個相應的文件夾,以MonYYYY結尾,您必須查找? – Matt

+0

我假設你的正則表達式的作品,但'$ Matches.Year'會在你的文件名例子中輸出「1234」?有什麼方法可以確保你的約會總是在同一個地方嗎?或者你有某種參考? – 30000MONKEYS

+1

'[datetime] :: parseexact($ item.name.split('_')[2] .substring(0,6),'yyyyMM',$ null)''應該給你一個'[datetime]'對象。然後使用'ToString('MMMyyyy')'來重新格式化它。 – TheMadTechnician

回答

0

您可以從您的get-childitem成一個函數調用改變這個

Param(
[string]$subject = "AAA_123456789_201705021541_AAAAAA.pdf" 
) 
Clear-Host 

if ($subject -imatch '_([2-9][0-9]{3})(\d{2})') { 
$Year = $matches[1] 
$Month = $matches[2] 
$Month = (Get-Culture).DateTimeFormat.GetMonthName($Month) 
Write-Host "Extracted:`n$Month,$Year" 
} else { 
Write-Error "No Matches were found dog" 
} 
+0

非常感謝!這正是我正在尋找的! – jat421

0

你是在找這個嗎?

$folder_name='201705'; 
$year_month = [datetime]::ParseExact($folder_name, "yyyyMM", $null); 
$year_month; 

如果是,請使用它,否則請詢問確切的要求,而不是這樣長的問題。我希望這有助於