2017-05-04 97 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; 

如果是,请使用它,否则请询问确切的要求,而不是这样长的问题。我希望这有助于