使用powershell根据文件名插入数据到文件中



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

替换它
$filenames = @("C:SCRIPTCBM-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
}

如果你仔细看,你可以看到我是根据文件名得到这个信息的。文件名将始终为MNEMONIC-MACHINE-DRIVE-YYYMMDDHHMMSS.txt.

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

编辑:

我需要提取文件名的一部分,并将其插入到文件中。例如,对于文件CBM-FS01- e -20130203114114.txt,我需要将助记器(CBM-FS01)和YYYMMDD(2013-02-03)提取到文件中。因此

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

我认为这应该可以工作,只要这些文件名模式是可预测的(并且我已经正确地预测了它们)

$filenames = @("C:SCRIPTCBM-FS01-E-20130203114114.txt.out")
$regex = '^([^-]+-[^-]+)-([A-Z])-(d{4})(dd)(dd).+'
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
}

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

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

最新更新