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 になります。

いくつかのファイルのスクリプトを変更するのは問題ありませんが、これを 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:" `
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 に答える