0

在我的 PowerShell 脚本中,我收到一个我不理解的错误。

错误是:

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

Invalid regular expression pattern:
Menu "User" {
   Button "EXDS" {
      Walk_Right "EXDS"
   }
}
.
At C:\test.ps1:7 char:18
+ ($output -replace <<<<  $target) | Set-Content "usermenuTest2.4d.new"
    + CategoryInfo          : InvalidOperation: (
Menu "User" {...do"
  }
}
:String) [], RuntimeException
    + FullyQualifiedErrorId : InvalidRegularExpression

我的脚本将文件读入字符串(字符串 A),然后尝试从另一个文件中删除字符串 A。这个错误是什么意思,我该如何解决?

我的代码:

#set-executionpolicy Unrestricted -Force 
#set-executionpolicy -scope LocalMachine -executionPolicy Unrestricted -force

$target=[IO.File]::ReadAllText(".\usermenuTest1.4d")
$output=[IO.File]::ReadAllText(".\usermenuTest2.4d")

($output -replace $target) | Set-Content "usermenuTest2.4d.new"
4

2 回答 2

2

尝试:

($output -replace [regex]::escape($target))

in-replace $target总是被评估为 a regular expression。在您的情况下$target包含一些regex special character并且无法正确解析,那么您需要转义所有特殊字符。.net 方法有助于完成这项[regex]::escape()工作。

于 2013-05-01T05:55:40.507 回答
0

这可能是因为 $target 为空($output 也是如此)。

.NET 将点替换为启动 PowerShell 的初始工作目录(通常是您的主目录或系统根目录)。我猜usermenuTest1.4d位于不同的目录中,而您正在从该目录运行此脚本。ReadAllText 正在初始目录中查找文件,但未找到。

如果您在usermenuTest1.4d$target=[IO.File]::ReadAllText(".\usermenuTest1.4d")所在目录中的命令提示符下运行,您将看到一条错误消息,告诉您它找不到文件并显示它正在寻找的完整路径,这将不同于你所期望的。或者,您可以将以下行添加到脚本中,以查看它将用哪个目录替换点:

[environment]::currentdirectory

以下任何一项都应该有效:

$target = Get-Content .\usermenuTest1.4d | Out-String

$target = [IO.File]::ReadAllText("$pwd\usermenuTest1.4d")

$target = [IO.File]::ReadAllText((Resolve-Path usermenuTest1.4d))

[environment]::currentdirectory = $pwd
$target=[IO.File]::ReadAllText('.\usermenuTest1.4d')

最后一个是不必要的麻烦,但我把它放进去帮助弄清楚发生了什么。

当然,在设置 $output 时也应该这样做。

于 2013-05-02T17:57:20.753 回答