2013-03-19 89 views
0

我有一個PowerShell腳本進入文件,並且對於E:的每個實例,它都將用代替它CBM-FS01 | 2013-02-03 | E:使用PowerShell基於文件名將數據插入文件

$filenames = @("C:\SCRIPT\CBM-FS01-E-20130203114114.txt.out") 
foreach ($file in $filenames) { 
    $outfile = "$file" + ".sql" 

    Get-Content $file | Foreach-object { 
     $_ -replace "E:","CBM-FS01|2013-02-03|E:" ` 
    } | Set-Content $outfile 
} 

如果你看近,你可以看到,我得到基於文件名此信息。文件名將始終爲助記符-MACHINE-DRIVE-YYYMMDDHHMMSS.txt

修改幾個文件的腳本是好的,但我可能需要在一百個文件上運行這個腳本!有沒有辦法使用PowerShell來使用GET-CHILDITEM cmdlet並讓PowerShell根據不同的文件名自動執行-replace?

編輯: 我需要提取部分文件名,並將其插入到文件中。例如,對於文件CBM-FS01-E-20130203114114.txt,我需要將助記機(CBM-FS01)和YYYMMDD(2013-02-03)提取到文件中。因此,

$_ -replace "E:","CBM-FS01|2013-02-03|E:" ` 

回答

1

我認爲這應該工作,只要這些文件名模式是可預測(和我他們正確預測)

$filenames = @("C:\SCRIPT\CBM-FS01-E-20130203114114.txt.out") 

$regex = '^([^-]+-[^-]+)-([A-Z])-(\d{4})(\d\d)(\d\d).+' 

foreach ($file in $filenames) { 

    $outfile = "$file" + ".sql" 

    $ReplaceString = ($file | Split-Path -leaf) -replace $regex,'$1|$3-$4-$5|$2:' 

    Get-Content $file | Foreach-object { 
     $_ -replace "E:",$ReplaceString 
    } | Set-Content $outfile 
} 
+0

這有效!但是,我們有一些奇怪的文件名是CBM-EXXFS-001-E-20130203114114.txt和CBMFS01-E-20130203114114.txt。我將如何修改正則表達式? – 2013-03-19 20:15:10

+0

無視。我做了一點實驗。對於第一個例子,我將它修改爲$ regex ='^([^ - ] + - [^ - ] + - [^ - ] +) - ([AZ]) - (\ d {4})(\ d \ d)(\ d \ d)。+」 – 2013-03-19 20:29:56

0

不太確定的問題。這聽起來像你有一堆相同模式的文件。您可以使用-match運算符來進行一些regex比較。

$pattern = '[a-zA-Z]+-[a-zA-Z]+-E-[0-9]+\.txt' 
$files = Get-ChildItem C:\ -Recurse | ? {$_.name -match $pattern} 
foreach($file in $files){ 
    ... 
} 
+0

不,不是真的想我試圖完成。我將編輯問題更清楚。 – 2013-03-19 18:09:03