我在制作“互动”时遇到了一种奇怪的行为。 PS脚本。 启动时,脚本需要用户请求的信息。我使用正则表达式来评估结果,但其中一个失败了:
$a = ""
while (!$a)
{
Write-Host "`nSome text to instruct the user:"
$Global:a = Read-Host
if($a -notmatch "a1[a-z,A-Z]{6}$")
{
Write-Host "no match!"
}
else {Write-Host "match"}
}
程序等待以' a1'开头的字符串。接着是6个字母。
当我从ISE运行此代码段时,它可以正常工作。提供测试值a1szvite它返回“匹配”,然而当我将其保存为独立脚本并在普通的PowerShell窗口中运行时,它返回“没有匹配!”#39;和继续要求另一个值,表明由于某种原因$a
没有写入数据。
所有其他正则表达式都像魅力一样,我对这里的问题感到有些困惑。具有相同馈送值的相同代码行如何返回不同的结果?
我真的认为这是我的一些小错误,我只是不知道它在哪里。
提前致谢!
答案 0 :(得分:2)
我已对此进行测试,并获得与您相同的结果。为了帮助解释我的发现,我在您的脚本中添加了以下行。
write-host "$a" -ForegroundColor Yellow
write-host "$Global:a" -ForegroundColor Red
当脚本在ISE之外运行时, $global:a
和$a
是不同的变量。作为Frode F. mentions in comments,脚本具有自己的范围,因此$a
是脚本的本地脚本。您收集使用输入的行是在全局范围内定义另一个名为$a
当我在ISE之外运行您的脚本时,我只会收到红色文本,告诉我您的-notmatch
正在检查$a
的原始空值。这证明了范围问题。
从第$Global:a = Read-Host
行移除范围修饰符,并将其更改为$a = Read-Host
。这样所有行都引用相同的变量。
旁注:我会将您的正则表达式字符串更新为^a1[a-z]{6}$
匹配运算符,而大多数其他字符串不区分大小写,以便匹配大写和小写。另外你提到字符串必须以a1开头,所以使用行锚的开头会强制执行。