在文本文件中查找字符串,并将其替换为父文件夹的名称

时间:2012-12-08 15:13:36

标签: powershell-v2.0

我有这个问题,我必须在所有文本文件中用其父文件夹的名称替换字符串“121212”(例如,如果父文件夹名为“123456”,则字符串“121212”应替换为“123456” “)

我以为我用以下命令想出了如何做到这一点:

PS E:\testenvironment> $parent=get-childitem -recurse | where {$_.FullName -match "[testenvironment]\\\d{6}$"} | foreach {$_.Name}
PS E:\testenvironment> $parent
123456
456789
654321
987654
PS E:\testenvironment> $files=get-childitem -recurse | where {$_.FullName -match "\\\d{6,6}\\AS400\\test3.txt$"} | foreach {$_.FullName}
PS E:\testenvironment> $files
E:\testenvironment\123456\AS400\test3.txt
E:\testenvironment\456789\as400\test3.txt
E:\testenvironment\654321\AS400\test3.txt
E:\testenvironment\987654\AS400\test3.txt
PS E:\testenvironment> foreach ($file in ($files)) {Get-Content "$file" | foreach-Object {$_ -replace "121212", "($name in ($parent))"} | set-content "$file"}

但是我收到了这条消息:

Set-Content : The process cannot access the file 'E:\testenvironment\123456\AS400\test3.txt' **because it is being used by another process**.
At line:1 char:127
+ foreach ($file in ($files)) {Get-Content "$file" | foreach-Object {$_ -replace "121212", "($name in ($parent))"} | set-content <<<<  "$file"}
    + CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
    + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand

(...我收到的每个test3.txt文件的课程......)

我无法弄清楚如何将“当前内存”转换为新变量,以便可以使用新数据覆盖文件(当前位于内存中)。

1 个答案:

答案 0 :(得分:0)

如果所有文本文件都在您发布的目录结构中,则以下内容将完成工作:

get-childitem $testEnvPath -recurse -filter "*.txt" | foreach{
    $content = Get-Content $_.fullname 
    #To get the file's grandparent directory name ($_.fullname -split '\\')[-3]
    $content -replace "121212", ($_.fullname -split '\\')[-3] | 
    set-content $_.fullname
}

请注意,要“移动”到内存中的下一个文件/目录,这些项的枚举必须在foreach语句中,而您在外部枚举它们。

希望有所帮助。