【发布时间】:2021-12-16 17:36:16
【问题描述】:
我终于缩小了问题的范围,但需要帮助理解为什么。
从批处理文件中调用 Powershell,以下方法可以替换文件中的字符串:
Powershell -Command "$foobar=[IO.File]::ReadAllText("$Env:File") ;
$foobarred= $foobar -replace '(?<foo>.*Backup.).*.(?<bar>..Backup.)', '${foo}Enabled${bar}' ;
[IO.File]::WriteAllText("$Env:File", $foobarred); "
现在如果我尝试这个,命令会失败:
Powershell -Command "$foobar=[IO.File]::ReadAllText("$Env:File") ;
$foobarred= $foobar -replace '(?<foo>.*$Env:StrStart.).*.(?<bar>..$Env:StrEnd.)', '${foo}$Env:StrVal${bar}' ;
[IO.File]::WriteAllText("$Env:File", $foobarred); "
如果我使用从 Batch 传入的变量,它每次都会失败。如果我在命令中使用 PlainText 代替替换值,它就可以正常工作。为什么会这样?
【问题讨论】:
-
您在这里使用的是动态创建的正则表达式,并且您没有对任何变量进行正则表达式转义。您需要显示您正在使用的变量值,理想情况下也需要使用示例文件。 “每次都失败”信息太少,无法继续。
-
@Tomalak - 变量在 GOTO 循环中生成。总是有一个开始标签的模式:
(.*SomeText.)然后是我要替换的文本.*.然后是结束标签:(..SomeText.)我有脚本和批处理文件的全部范围,这一切都实现了,但它非常罗嗦。不幸的是,我不允许从我的工作 PC 上提供我正在使用的任何信息。变量将是“StringStart”、“StringVal”和“StringEnd”——“StringVal”将是我要插入的文本。 -
@Tomalak,您希望我尝试重新编辑问题以包含所有以前包含的信息,以便您了解完整的上下文吗?我认为模组在 S.O.元方面将用编辑次数烧掉这个问题
-
再看一遍,我意识到我把工作版本与非工作版本放在了一起。工作版本没有任何变量 - 只有 ${foo} 和 ${bar} - 命名的 Regex BackReferences。变量中的字符串不会有任何特殊字符,可能 $StrVal 除外。 . .在这种情况下,我知道我应该使用 [regex]::escape($StrVal)。 . .我认为我的部分问题是我也在尝试在正则表达式的模式部分中使用变量,但它正在将它们作为元
$拾取 - 我接近了吗? -
不要将问题的解决方案添加到问题中。而是将其发布为答案,如果它解决了您的问题,您也可以将其标记为正确答案。
标签: powershell batch-file