2014-04-21 3 views
0

아래 스크립트는 나를 당황케하는 powershell의 예기치 않은 동작을 보여줍니다. 이 문제는 내가 잘못하고있는 것 같지만, 알아낼 수는 없습니다. 이 스크립트는 특정 요일의 특정 시간을 확인하고 매개 변수 세트에 따라 다양한 조치를 취합니다. 내가 포함 된 루프의 반복에 번갈아 불린 있습니다. 적어도 문제가있다. 여기에 내가 변수를 사용하고 방법을 설명하고 이상한 행동을 생성하는 예제 스크립트는 다음과 같습니다이상한 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 
} 

예상되는 동작은 스크립트가 루프 불구을 본 순간 (조건은 시간과 조건의 상대가 될해야한다는 것입니다 in $true) 그리고 다른 조건부 $DisabledRequests 변수의 상태를 검사합니다. 변수가 처음에 $false이기 때문에 첫 번째 반복에서 조건부가 올바르게 실행됩니다. 이 조건부 동작의 일부는 변수 $DisabledRequests$true으로 설정하는 것입니다. 적어도 $DisabledRequests -eq $true 부분은 콘솔에 "True"를 인쇄합니다.

변수가 $DisabledRequests 인 경우 조건부 ($DisabledRequests -eq $false)이 여전히 true로 평가되는 이유는 무엇입니까?

편집 :

나는 또한 내가 참으로 Set-Variable으로 다시 작성 후 Clear-Variable와 변수를 지우고 시도했습니다, 그리고 중 예상대로 작동하지 않는 것을 추가 할

.

답변

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에서 온라인으로 볼 수 있습니다.