powershell 根据字符串在文本文件中多次复制行并更改重复行

yzuktlbb  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(163)

Short:我正在尝试复制文件夹中基于某个字符串的所有文件中的行,然后仅替换复制行中的原始字符串。
原始文本文件的内容(文件中有双引号):

"K:\FILE1.ini"
"K:\FILE1.cfg"
"K:\FILE100.cfg"

我只想在一行中出现字符串“.ini”的情况下将整行复制4次。
复制行后,我想将复制行(原始行保持不变)中的字符串更改为:例如,“.inf”、“.bat”、“.cmd”、“.mov”。
因此,脚本的预期结果如下:

"K:\FILE1.ini"
"K:\FILE1.inf"
"K:\FILE1.bat"
"K:\FILE1.cmd"
"K:\FILE1.mov"
"K:\FILE1.cfg"
"K:\FILE100.cfg"

这些文件很小,所以不需要使用STREAMS。
我的PowerShell之旅才刚刚开始,但多亏了这个社区,我已经知道如何递归地替换文件中的字符串:

$directory = "K:\PS"
Get-ChildItem $directory -file -recurse -include *.txt | 
    ForEach-Object {
        (Get-Content $_.FullName) -replace ".ini",".inf" |
            Set-Content $_.FullName
    }

但我不知道如何多次复制某些行,以及如何处理这些复制行中的多个字符串替换。

尚未;)

能给我指个正确的方向吗?

scyqe7ek

scyqe7ek1#

要使用运算符-replace实现此目的,您可以执行以下操作:


# Define strings to replace pattern with

$2replace = @('.inf','.bat','.cmd','.mov','.ini')

# Get files, use filter instead of include = faster

get-childitem -path [path] -recurse -filter '*.txt' | %{
    $cFile = $_
    #add new strings to array newData
    $newData = @(
        #Read file
        get-content $_.fullname | %{
            #If line matches .ini
            If ($_ -match '\.ini'){
                $cstring = $_
                #Add new strings
                $2replace  | %{
                    #Output new strings
                    $cstring -replace '\.ini',$_
                }
            }
            #output current string
            Else{
                $_
            }
        }
    )
    #Write to disk
    $newData | set-content $cFile.fullname
}

这将为您提供以下输出:

$newdata
"K:\FILE1.inf"
"K:\FILE1.bat"
"K:\FILE1.cmd"
"K:\FILE1.mov"
"K:\FILE1.ini"
"K:\FILE1.cfg"
"K:\FILE100.cfg"

相关问题