2016-04-25 41 views
0

創建'交互式'PS腳本時遇到了奇怪的行爲。 啓動時,腳本需要用戶請求的信息。我使用正則表達式來評估的結果,但其中一人剛失敗:與ISE相比,正則表達式在控制檯中的作用不同

$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"} 
    } 

程序等待與隨後6個字母「A1」開頭的字符串。

當我從ISE運行此代碼段時,它的工作方式應該如此。提供測試值a1szvite它返回'匹配',但是當我將它保存爲一個獨立的腳本並在正常的PowerShell窗口中運行它時,它返回'不匹配!',並不斷詢問另一個值,表明$a不是由於某種原因寫入數據。

所有其他的正則表達式就像一個魅力工作,我有點困惑,這裏有什麼事情。具有相同餵食值的同一行代碼如何返回不同的結果?

我真的認爲這是我的一些小錯誤,我只是不知道它在哪裏。

在此先感謝!

+0

_程序等待一個以'a1'開頭,後跟6個字母的字符串。這不完全正確。你的正則表達式在它結束時會匹配。你也需要開始行錨。 ' 「^ A1 [A-Z,A-Z] {6} $」'。也許你的測試用例偶然匹配。 – Matt

+0

你說得對,我不太清楚$和^可以用來幹什麼,但現在清楚了!謝謝! – SecThor

回答

2

我已經測試過這個並獲得與您相同的結果。爲了幫助解釋我的發現,我在腳本中添加了以下幾行。

write-host "$a" -ForegroundColor Yellow 
write-host "$Global:a" -ForegroundColor Red 

$global:a$a是不同的變量時,腳本正在ISE之外運行。由於Frode F. mentions in comments該腳本有其自己的範圍,所以$a是腳本的本地。在那裏你收集你定義在一個名爲$a

當我運行腳本ISE以外的全球範圍內的另一個變量使用的輸入線我只得到紅色文字,告訴我你的-notmatch是檢查針對$a原來的空值。這證明了範圍問題。

刪除範圍修飾符離線$Global:a = Read-Host並將其更改爲只有$a = Read-Host。這樣所有行都引用相同的變量。


附註:我會更新你的正則表達式字符串^a1[a-z]{6}$匹配運營商和大多數人不區分大小寫,這樣將匹配大寫和小寫的一致好評。你也提到該字符串必須以a1開頭,所以使用行首錨點將強制執行該操作。

+1

當你運行一個ex。在ISE中未保存的腳本中,您可以看到ISE在嵌入式PowerShell控制檯中逐行寫入代碼,這會使變量成爲全局變量。當你執行一個保存的腳本時,它被稱爲'。\ script.ps1',它在腳本範圍中記錄了'$ a = ..'變量。 –

+0

@FrodeF。是啊。這很有道理。 – Matt

+0

奇怪的是,當ISE執行腳本時,它不使用點源,但變量仍在全局範圍內修改,但是當您在普通powershell控制檯中運行它時,它將使用腳本範圍。ISE的一個有趣的功能,但我想它會模仿所有的行,就像它是一個未保存的文件一樣,但是用一個腳本調用來代替這些行以保持它的清潔。 –