使用powershell根据文件名将数据插入文件

使用powershell根据文件名将数据插入文件,powershell,scripting,Powershell,Scripting,我有一个进入文件的powershell脚本,对于E:的每个实例,它都将替换为CBM-FS01 | 2013-02-03 | E: $filenames = @("C:\SCRIPT\CBM-FS01-E-20130203114114.txt.out") foreach ($file in $filenames) { $outfile = "$file" + ".sql" Get-Content $file | Foreach-object { $_ -replac

我有一个进入文件的powershell脚本,对于E:的每个实例,它都将替换为CBM-FS01 | 2013-02-03 | E:

$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-yyymmddhmmss.txt

为几个文件修改脚本是可以的,但是我可能需要在一百个文件上运行它!是否有方法使用powershell使用GET-CHILDITEM cmdlet并让powershell根据不同的文件名自动执行-replace

编辑: 我需要提取部分文件名,并将其插入文件中。例如,对于文件CBM-FS01-E-20130203114114.txt,我需要将助记符机器(CBM-FS01)和YYYYMMDD(2013-02-03)提取到文件中。因此

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

对这个问题不太确定。听起来你有一大堆相同模式的文件。您可以使用-match操作符进行一些比较

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

我认为这应该行得通,只要那些文件名模式是可预测的(我已经正确预测了它们)


不,不是我想要的。我会把问题修改得更清楚。这样行!但是,我们有一些奇怪之处,文件名是CBM-EXXFS-001-E-20130203114114.txt和CBMFS01-E-20130203114114.txt。如何修改正则表达式?忽略不计。我做了一些实验。对于第一个示例,我将其修改为$regex='^([^-]+-[^-]+-[^-]+-[A-Z])-(\d{4})(\d\d)(\d\d)。+'
$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
}