Powershell输出文件缺少输入文件中的行

Powershell输出文件缺少输入文件中的行,powershell,powershell-2.0,Powershell,Powershell 2.0,为什么以下脚本生成的输出文件不包含原始文件中包含的所有行?我在一行一行地执行替换逻辑,但我并没有明确地删除任何行 [regex]$r = "\$\%\$@@(.+)\$\%\$@@"; (Get-Content $inputFile) | Foreach-Object { $line = $_; $find = $r.matches($line); if ($find[0].Success) { foreach

为什么以下脚本生成的输出文件不包含原始文件中包含的所有行?我在一行一行地执行替换逻辑,但我并没有明确地删除任何行

[regex]$r = "\$\%\$@@(.+)\$\%\$@@";

(Get-Content $inputFile) | 
    Foreach-Object {
        $line = $_;
        $find = $r.matches($line);

        if ($find[0].Success) {
            foreach ($match in $find) {
                $found = $match.value           
                $replace = $found -replace "[^A-Za-z0-9\s]", "";            
                $line.Replace($found, $replace);
            }       
        }
    } | 
Set-Content $outputFile
输入文件

输出文件


只有在管道找到匹配项时,才将内容输出到管道,如下所示:

$line.Replace($found, $replace)
如果未找到匹配项,则需要在不进行任何替换的情况下输出该行:

[regex]$r = "\$\%\$@@(.+)\$\%\$@@";

(Get-Content $inputFile) | 
    Foreach-Object {
        $line = $_;
        $find = $r.matches($line);

        if ($find[0].Success) {
            foreach ($match in $find) {
                $found = $match.value           
                $replace = $found -replace "[^A-Za-z0-9\s]", "";            
                $line.Replace($found, $replace);
            }       
        }

        Else { $line }

    } | 
Set-Content $outputFile

如果($find[0].Success)为$false,该行会发生什么情况?如果条件为false,我不会对该行执行任何操作,所以我假设它将直接传输到输出文件。我想你应该质疑这个假设。同意-我不认为我完全理解Foreach循环中发生的事情。你在脚本块的开头将$分配给$行。此行:$line.Replace($found,$Replace)正在将替换的文本输出到管道,但它仅在存在匹配项时运行。如果没有匹配项,则不会向管道输出任何内容,并且该行(存储在$line中)会被管道中的下一行覆盖。