处理代码,该代码将替换文件夹中文本文件中的一组字符。有没有办法可以为文件夹中的所有文件执行此操作。我正在使用Windows 7操作系统和Powershell版本3.附上我拥有的代码。问题是,当我运行代码(New_NOV_1995.txt)时它会创建一个新文件,但它不会像代码中提到的那样更改新文件中的任何字符。非常感谢欣赏。
$lookupTable = @{
'¿' = '|'
'Ù' = '|'
'À' = '|'
'Ú' = '|'
'³' = '|'
'Ä' = '-'
}
$original_file = 'C:\FilePath\NOV_1995.txt'
$destination_file = 'C:\FilePath\NOV_1995_NEW.txt'
Get-Content -Path $original_file | ForEach-Object {
$line = $_
$lookupTable.GetEnumerator() | ForEach-Object {
if ($line -match $_.Key)
{
$line = $line -replace $_.Key, $_.Value
}
}
$line
} | Set-Content -Path $destination_file
答案 0 :(得分:1)
在下面的示例中,我假设H:\ Replace_String是一个目录。在上面的代码中,您没有反斜杠,因此它只会选择H:的根目录中的文件。
$configFiles = Get-ChildItem -path H:\Replace_String\*.txt
foreach ($file in $configFiles)
{
(Get-Content $file) |
Foreach-Object { $_ -replace "Cat", "New_Cat" } |
Foreach-Object { $_ -replace "Dog", "New_Dog" } |
Set-Content $file
}
答案 1 :(得分:1)
Tony Hinkle提出的(原始)答案需要另一个循环。原因是Get-Content
生成一个数组。每一行代表数组的一个元素。
$configFiles = Get-ChildItem -path 'H:\Replace_String\*.txt'
foreach ($file in $configFiles){
$output = @()
$content = Get-Content $file
foreach ($line in $content) {
$line = $content.Replace("Cat", "New_Cat")
$line = $content.Replace("Dog", "New_Dog")
$output += $line
}
$output | Set-Content -Path $file
}
编辑:我注意到Tony Hinkle的回答在我发布时被修改了。他正在通过管道发送所有内容,我将数组存储在变量中,然后循环遍历。管道方法可能更有效。对于数组的每个元素,具有第二个循环的变量更容易修改,而不仅仅是两个替换。