下面的脚本演示了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,这不起作用正如预期的那样。
答案 0 :(得分:1)
您的问题与作用域有关 - 在函数退出后,函数内部创建的变量(使用显式范围限定符指定)不再存在。
如果在分配给变量时使用:
$script:DisabledRequest = $true
然后你会看到你的期望。有关范围的详细信息,您可以阅读内置帮助'about_Scopes'和'about_Variables'中的主题,可在线获取:http://technet.microsoft.com/en-us/library/hh847849.aspx和http://technet.microsoft.com/en-us/library/hh847734.aspx。