在我的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"
答案 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时应该这样做。