批处理文件中的 Powershell - 替换时保持通配符匹配?

批处理文件中的 Powershell - 替换时保持通配符匹配?

我将其用作批处理文件中的 Powershell 命令的一部分来替换另一个文件中的文本:

-replace 'contrast=.*? -b:v', 'contrast=.*?,fps=%FRAMERATE% -b:v'

被修改的文件可能有一个特定的对比值,如下所示:

contrast=1.03

如果我尝试使用如上所示的通配符.*?,它​​不会保留 1.03 值进行对比,而只是用文字通配符替换它,因此我最终得到contrast=.*?修改后的文件。

对比度值可能会改变。有什么方法可以告诉 Powershell,无论替换命令第一部分的值是什么,它都需要在下一部分保持不变?

有人说把它放在方括号中(因为它在批处理文件中,所以需要转义)但是这不起作用,如下所示:

-replace 'contrast=/[.*?/] -b:v', 'contrast=/[.*?/],fps=%FRAMERATE% -b:v'

所做的只是在修改后的文件中给我以下内容:contrast=/[.*?/]

我确信存在一些奇怪的组合或方法可以做到这一点,我只是不知道如何做。

在此先感谢任何可以对此作出阐释的人。

答案1

你可以!-replace支持使用捕获组,并自动将它们设置为变量$1$2等,您可以使用:

# Example input text
$text = 'contrast=1.03 -b:v
contrast=2.34 -b:v
contrast=6.66 -b:v'

$text -replace '(.*?) -b:v', '$1,fps=%FRAMERATE% -b:v'

# Output:
contrast=1.03,fps=%FRAMERATE% -b:v
contrast=2.34,fps=%FRAMERATE% -b:v
contrast=6.66,fps=%FRAMERATE% -b:v

$1不是 powershell 变量,因此$替换字符串中必须是文字。如果您确实想在正则表达式中使用变量,请确保对其进行转义:

$text -replace '(.*?) -b:v', "`$1,fps=$framerate -b:v"

请参阅“使用捕获组替换”部分SS64查看更多示例。

相关内容