奇怪的Powershell变量行为

时间:2014-04-21 13:52:49

标签: variables loops conditional-statements powershell-ise

下面的脚本演示了powershell中的意外行为让我感到困惑。问题很可能是我做错了,但我无法弄明白。该脚本查看特定日期的特定时间,并根据一组参数执行各种操作。我有一个布尔值,它交替包含循环的迭代。或者至少它应该存在问题。这是一个示例脚本,演示了我如何使用变量并产生奇怪的行为:

$DisabledRequests = $false
$Time = Get-Date -UFormat %R
$Day = Get-Date -UFormat %u

function checktime() {


if($Time -ge "07:00" -and $Time -le "19:00" -and $Day -le "5"){

    if($DisabledRequests -eq $false){
        Write-Host "Time is $time, Day is $day.  Inside disabledrequests -eq false statement."
        $DisabledRequests = $true #Sets variable to true
        $DisabledRequests -eq $true #Prints true on the console because the statement is true
    }else{


    }

}else{

    Write-Host "Outside limited time parameters."
    if($DisabledRequests -eq $true){
            Write-Host "Changing disabled requests var to false."
            $DisabledRequests = $false
    }
}

}


for($i=0; $i -le 10; $i++){
checktime
}

预期的行为是脚本应循环通过条件(目前条件相对于时间应该导致$true)然后另一个条件检查$DisabledRequests变量的状态。因为变量最初是$false,所以条件在第一次迭代时正确运行。条件的一部分操作是将变量$DisabledRequests设置为$true。至少,关于$DisabledRequests -eq $true的部分打印" True"在控制台上。

问题是,如果$DisabledRequests变量现在为真,为什么条件($DisabledRequests -eq $false)仍被评估为真?

编辑:

我还要补充一点,我已尝试使用Clear-Variable清除变量,然后将Set-Variable重新创建为true,这不起作用正如预期的那样。

1 个答案:

答案 0 :(得分:1)

您的问题与作用域有关 - 在函数退出后,函数内部创建的变量(使用显式范围限定符指定)不再存在。

如果在分配给变量时使用:

$script:DisabledRequest = $true

然后你会看到你的期望。有关范围的详细信息,您可以阅读内置帮助'about_Scopes'和'about_Variables'中的主题,可在线获取:http://technet.microsoft.com/en-us/library/hh847849.aspxhttp://technet.microsoft.com/en-us/library/hh847734.aspx