【问题标题】:Windows Powershell to replace a set of characters from a text files in a folderWindows Powershell替换文件夹中文本文件中的一组字符
【发布时间】:2016-02-04 04:50:35
【问题描述】:

正在编写代码,该代码将替换文件夹中文本文件中的一组字符。有没有一种方法可以对文件夹中的所有文件执行此操作。我正在使用 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

【问题讨论】:

  • 在第一行使用Get-ChildItem 而不是Get-Content

标签: powershell


【解决方案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
}

【讨论】:

  • Thx Tony...此代码给出错误:找不到路径的位置参数。
  • 它对我有用——唯一不同的是我使用了 C: 而不是 H:。我正在运行 PowerShell 4.0,因此如果您运行的是旧版本,可能会有所不同。我谷歌“找不到路径的位置参数”,它的命中率为零。您是否包含完整的错误消息?您可以尝试在 H:\Replace_String*.txt 周围加上引号,但我不知道还有什么可以尝试的。
  • "找不到在 H:\Replace_string\.ps1..+ $ ConfigFiles = Get-content - path
  • 使用Get-ChildItem,而不是Get-Content
  • ...它必须是-path 而不是- path。请将代码复制并粘贴到我的答案中,然后不加修改地运行它。一旦你有了一些可以工作的东西,你就可以根据需要对其进行修改。
【解决方案2】:

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 的答案在我发布时已被修改。他通过管道发送所有内容,我将数组存储在变量中然后循环。流水线方法可能更节省内存。对于数组的每个元素,带有第二个循环的变量更容易被修改,而不仅仅是两个替换。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2020-09-27
    • 2016-09-10
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多