使用powershell根据文件名将数据插入文件
我有一个进入文件的powershell脚本,对于E:的每个实例,它都将替换为CBM-FS01 | 2013-02-03 | E:使用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
$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
}