用正则表达式替换的 Powershell 脚本不起作用

发布于 2024-12-17 07:35:03 字数 1226 浏览 1 评论 0原文

我有以下脚本,它逐行读取文件并用指定的文本替换每行中的模式,然后将其写入另一个文件:

param
(
    [string] $inFilePath,
    [string] $outFilePath,
    [string] $inputPattern,
    [string] $replacePattern
)

function Main()
{
    $sr = $null;
    $sw = $null;

    try
    {
        $sr = New-Object System.IO.StreamReader($inFilePath);
        $sw = New-Object System.IO.StreamWriter($outFilePath, $true);
        do
        {
            $fileLine = $sr.ReadLine();
            $fileLine2 = "";
            if ($fileLine -eq $null)
            {
                break;
            }
            $fileLine = $fileLine + [System.Environment]::NewLine;
            $fileLine2 = [System.Text.RegularExpressions.Regex]::Replace($fileLine, $inputPattern, $replacePattern);
            $sw.Write($fileLine2);
        }
        while ($fileLine -ne $null);
    }
    finally
    {
        $sr.Dispose();
        $sw.Dispose();
    }
}

Main;

不幸的是,当我将脚本保存为 filereplace.ps1 并像这样调用它时

: >powershell .\filereplace.ps1 c:\docs\infile.txt c:\docs\outfile.txt '.{30,}\->.*\r\n' '*'

我明白了错误:

文件名、目录名或卷标语法不正确。

知道我可能做错了什么吗?我怀疑用于搜索替换的正则表达式模式有问题 - 当我删除 \-> 时,它可以工作,但没有理由认为这应该是一个问题。

I have the following script which reads in a file line by line and replaces a pattern in each line with specified text, then writes this to another file:

param
(
    [string] $inFilePath,
    [string] $outFilePath,
    [string] $inputPattern,
    [string] $replacePattern
)

function Main()
{
    $sr = $null;
    $sw = $null;

    try
    {
        $sr = New-Object System.IO.StreamReader($inFilePath);
        $sw = New-Object System.IO.StreamWriter($outFilePath, $true);
        do
        {
            $fileLine = $sr.ReadLine();
            $fileLine2 = "";
            if ($fileLine -eq $null)
            {
                break;
            }
            $fileLine = $fileLine + [System.Environment]::NewLine;
            $fileLine2 = [System.Text.RegularExpressions.Regex]::Replace($fileLine, $inputPattern, $replacePattern);
            $sw.Write($fileLine2);
        }
        while ($fileLine -ne $null);
    }
    finally
    {
        $sr.Dispose();
        $sw.Dispose();
    }
}

Main;

Unfortunately, when I save the script as filereplace.ps1 and call it like this:

powershell .\filereplace.ps1 c:\docs\infile.txt c:\docs\outfile.txt '.{30,}\->.*\r\n' '*'

I get this error:

The filename, directory name, or volume label syntax is incorrect.

Any idea what I might be doing wrong? I suspect there is something wrong with the regex pattern used in searching for a replacement - when I remove the \->, it works, but there is no reason why this should be a problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁的年少不轻狂 2024-12-24 07:35:03

正是重定向运算符 > 导致了命令行中的问题。用 " 将整个命令括起来:

powershell ".\filereplace.ps1 c:\docs\infile.txt c:\docs\outfile.txt '.{30,}\->.*\r\n' '*'"

It is the redirection operator > that causes the problem in the command line. Enclose the whole command with ":

powershell ".\filereplace.ps1 c:\docs\infile.txt c:\docs\outfile.txt '.{30,}\->.*\r\n' '*'"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文