2017-05-04 3 views
0

Ich versuche, ein Skript zu erreichen, das erlaubt, durch Ordner und Dateien zu durchlaufen.Powershell-Extrakt Jahr und Monat von Zeichenkette

  1. Das Skript wird eine Datei importieren und den Namen und die Nummer aus der Datei extrahieren.
  2. Verwenden Sie die Namensschleife durch C:\Temp Ordner, um diesen Namen zu finden.
  3. Listen Sie alle Dateien in diesem Ordner auf und extrahieren Sie das Jahr und den Monat. Die Datei sieht unten wie und das Skript 201705 aus dem Dateinamen extrahieren und konvertieren die 05 Monate zu May AAA_123456789_201705021541_AAAAAA.pdf
  4. Das Skript nimmt dann alle Dateien, die May, June, July usw. und schicken sie in einen anderen Ordner sind durch eine Schaffung Ordner mit der Nummer aus der importierten Datei. Wenn zum Beispiel der Dateiname 05 enthält, wird der Ordner X00000000MAY2017 und die Dateien MAY-Dateien in diesen Ordner verschoben.

Die haben das folgende Skript bisher. Ich bin in der Lage, Dateien zu importieren extrahieren Sie die Informationen und durchlaufen Sie es, aber stecken bleiben an dem Teil, um Monat und Jahr aus dem Dateinamen zu extrahieren und sie in Variable zu setzen.

$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

Wie wissen Sie, wo das Datum in diesem Dateiname Zeichenfolge sein wird? Ich bin ein wenig verloren, wie auch Schritt 4 funktioniert. Also wird das übereinstimmende Datum einen entsprechenden Ordner haben, der in MonYYYY endet, nach dem Sie suchen müssen? – Matt

+0

Ich gehe davon aus, dass Ihre Regex-Art funktioniert, aber "$ Matches.Year" gibt "1234" in Ihrem Beispiel für Dateinamen aus? Gibt es eine Möglichkeit, dass Sie sicher sein können, dass Ihr Date immer am selben Ort sein wird? Oder haben Sie eine Art Referenz? – 30000MONKEYS

+1

'[datetime] :: parseexact ($ item.name.split ('_') [2] .substring (0,6), 'yyyyMM', $ null)' sollte dir ein '[datetime]' Objekt geben. Dann benutze 'ToString ('MMMyyyy')', um es neu zu formatieren. – TheMadTechnician

Antwort

0

hilft Ihnen, diese in einen Funktionsaufruf ändern können von Ihrem 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

Vielen Dank !! Genau das habe ich gesucht !!! – jat421

0

Suchst du das?

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

Wenn ja, bitte benutzen, sonst bitte genauen Anforderung anstelle einer solchen langen Frage stellen. Ich hoffe, das