0

我有一个放入文件的 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
}

如果您仔细观察,您会发现我正在根据文件名获取此信息。文件名将始终为MNEMONIC-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:" `
4

2 回答 2

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
}
于 2013-03-19T18:02:15.257 回答
0

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

$pattern = '[a-zA-Z]+-[a-zA-Z]+-E-[0-9]+\.txt'
$files = Get-ChildItem C:\ -Recurse | ? {$_.name -match $pattern}
foreach($file in $files){
    ...
}
于 2013-03-19T17:47:52.797 回答