字符串替换PowerShell中的错误

时间:2013-05-01 05:13:11

标签: windows powershell

在我的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"

2 个答案:

答案 0 :(得分:2)

尝试:

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

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

答案 1 :(得分:0)

这可能是因为$ target为null(因此是$ output)。

.NET将点替换为启动PowerShell的初始工作目录(通常是您的主目录或systemroot)。我猜测 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时应该这样做。