与ISE相比,Regex在控制台中的作用不同

与ISE相比,Regex在控制台中的作用不同,regex,powershell,Regex,Powershell,我在创建“交互式”PS脚本时遇到了一个奇怪的行为。 启动时,脚本需要用户请求的信息。我使用regex来评估结果,但其中一个失败了: $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!" }

我在创建“交互式”PS脚本时遇到了一个奇怪的行为。 启动时,脚本需要用户请求的信息。我使用regex来评估结果,但其中一个失败了:

$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窗口中运行时,它返回“不匹配!”,并不断询问另一个值,该值指示由于某种原因,
$a
未与数据一起写入

所有其他正则表达式都很有魅力,我有点搞不懂这里到底是怎么回事。具有相同输入值的相同代码行如何返回不同的结果

我真的认为这是我的一个小错误,我只是不知道它在哪里


提前谢谢

我已经测试过了,得到了与您相同的结果。为了帮助解释我的发现,我在你的脚本中添加了以下几行

write-host "$a" -ForegroundColor Yellow
write-host "$Global:a" -ForegroundColor Red
$global:a
$a
在ISE之外运行脚本时是不同的变量。由于脚本有自己的作用域,因此
$a
是脚本的本地部分。在全局范围内定义另一个名为
$a

当我在ISE之外运行您的脚本时,我只得到红色文本,它告诉我您的
-notmatch
正在检查
$a
的原始空值。这证明了范围问题

将范围修饰符从行中删除
$Global:a=Read Host
,并将其更改为just
$a=Read Host
。这样,所有行都引用相同的变量



旁注:我会将您的正则表达式字符串更新为
^a1[a-z]{6}$
匹配运算符和大多数其他运算符不区分大小写,因此将匹配大小写。您还提到字符串必须以a1开头,因此使用线锚的开头将强制执行该操作

我已经测试过了,得到了与您相同的结果。为了帮助解释我的发现,我在你的脚本中添加了以下几行

write-host "$a" -ForegroundColor Yellow
write-host "$Global:a" -ForegroundColor Red
$global:a
$a
在ISE之外运行脚本时是不同的变量。由于脚本有自己的作用域,因此
$a
是脚本的本地部分。在全局范围内定义另一个名为
$a

当我在ISE之外运行您的脚本时,我只得到红色文本,它告诉我您的
-notmatch
正在检查
$a
的原始空值。这证明了范围问题

将范围修饰符从行中删除
$Global:a=Read Host
,并将其更改为just
$a=Read Host
。这样,所有行都引用相同的变量



旁注:我会将您的正则表达式字符串更新为
^a1[a-z]{6}$
匹配运算符和大多数其他运算符不区分大小写,因此将匹配大小写。您还提到字符串必须以a1开头,因此使用线锚的开头将强制执行该操作

程序等待一个以“a1”开头,后跟6个字母的字符串。。事实并非如此。你的正则表达式将在结尾处匹配。你也需要线锚的开始<代码>“^a1[a-z,a-z]{6}$”。也许您的测试用例是偶然匹配的。您是对的,我不太确定$and^可以用来做什么,但现在已经很清楚了!谢谢你!程序等待一个以“a1”开头,后跟6个字母的字符串。。事实并非如此。你的正则表达式将在结尾处匹配。你也需要线锚的开始<代码>“^a1[a-z,a-z]{6}$”。也许您的测试用例是偶然匹配的。您是对的,我不太确定$and^可以用来做什么,但现在已经很清楚了!谢谢你!在ISE中运行ex.Unsave脚本时,您可以看到ISE在嵌入式powershell控制台中逐行写入代码,这将使变量成为全局变量。当您执行一个保存的脚本时,它被称为
\script.ps1
,意思是
$a=..
脚本范围内的一个变量。@FrodeF。啊,对。这很有道理。奇怪的是,当ISE执行脚本时,它不使用点源,但变量仍在全局范围内修改,但是当您在普通powershell控制台中运行它时,它将使用脚本范围。ISE的一个很时髦的功能,但我想它会模拟编写所有行,就像它是一个未保存的文件一样,但会用脚本调用替换这些行以保持其干净。@FrodeF我删除了全局修饰符,现在它似乎可以工作了,但它提出了另一个问题:为什么其他类似的代码段可以工作?然后我意识到它们实际上不起作用了。使用全局脚本,脚本在ISE中工作,但在ISE之外失败。如果没有全局变量,脚本将在ISE外部工作,但无法访问全局定义的变量。变量是在脚本开始时定义的,它们应该写在函数内部。我将尝试将变量传递给函数,而不是仅仅尝试写入它们。解决方案是脚本作用域而不是全局。当您在ISE中运行ex.Unsave脚本时,您可以看到ISE在嵌入式powershell控制台中逐行写入代码,这将使变量成为全局变量。当您执行一个保存的脚本时,它被称为
\script.ps1
,意思是
$a=..
脚本范围内的一个变量。@FrodeF。啊,对。这很有道理。奇怪的是,当ISE执行脚本时,它不使用点源,但变量仍在全局范围内修改,但是当您在普通powershell控制台中运行它时,它将使用脚本范围。ISE的一个时髦特性,但我猜它模仿了编写所有t