2012-03-31 4 views
0

나는 훌륭한 스크립트가 있습니다. 그것은 아주 복잡하고 수많은 "일들"을합니다 .. 전체 루프를 1000 루프 스크립트로 만들면 문제가 생깁니다.각 루프 사이에 내 runspace를 정리해야합니다 - 내 스크립트를 정리하는 방법

각 변수의 일부/두 개가 두 배가되고 각 루프마다 엉망이됩니다 ..

물론 이것은 같은 runspace에서 스크립트를 실행하기 때문에 발생합니다. 그럼 어떻게해야합니까? 스크립트가 끝날 때 remove-variable으로 모든 변수를 삭제 하시겠습니까? 아니면 각 실행 사이에 내 작업 공간을 비울 수있는 마법 같은 것이 있습니까?

은 내가 어수선 일을했습니다 느낌과 내가 불필요한 함수들이 그냥/변수가있을 경우 알려줍니다 스캐너의 일종이 필요하다는 것을 ... 나는 학습의 초기 단계에서 아직 오전이 스크립트는 나와 함께하고있다 "모든 방법"이므로 좋은 코딩 방법이 아닙니다.

그래서 내 상황에서 "모범 사례"는 무엇입니까?

+0

안녕하세요 Bart! 왜 제 질문을 편집 했습니까? – Sune

+0

아마 모든 1000 라인을 루프에서 실행할 필요가 없을까요? :-) –

+0

모범 사례는 작은 스크립트로 분해하고 (또는 푸시 할 때) 변수를 명시 적으로 초기화하는 것입니다. 어떤 종류의 명확한 Runspace Manouvre는 증상을 해결할 수 있습니다. 한 번에 같은 문제가 발생할 수 있습니다. –

답변

1

당신이 뭔가를 추가 할 수 있습니다 초기화 스크립트에 이렇게 작업에 :

. remove-uservars 

(가) 각 루프가 시작되기 전에 스크립트가 만든 모든 변수를 제거해야합니다 :

$sysvars = get-variable | select -Expand name 

    function remove-uservars { 
    get-variable | 
     where {$sysvars -notcontains $_.name} | 
     remove-variable 
    } 

는 그런 다음 while 루프의 상단에, 제거-uservars 기능을 소스 점.

+0

Fanrastic! 그냥 내가 뭘 찾고 있었는데 :)하지만 왜 내가 점 - 소스 기능을해야합니까? 전역 범위에 영향을 주나요? – Sune

+0

현재 범위 (전역 범위 일 수도 그렇지 않을 수도 있음)에 영향을주기 위해 도트 소스를 사용합니다. – mjolinor

2

때마다 깨끗한 "범위"로 시작하는 것은 다음이 충분히 시도 할 경우 : 당신은 로컬 변수 때문에 새로운 범위를 얻을 것이다 위

while (<loop_condition>) 
{ 
    & { 
     ... 1000 lines of script 
    } 
} 

에게 당신은 "스크립트의 1000 라인"을 실행할 때마다 그 범위는 다시 초기화해야합니다. 스크립트가 전역 또는 스크립트 변수를 설정하는 경우 $global:foo 또는 $script:bar이 방법은 작동하지 않을 수 있습니다 (루프 반복간에 전역/스크립트 변경 사항을 유지할지 여부에 따라 다름).

다음 (일반적으로 인정 하듯이 인위적인 예) 새로운 범위를 생성하면 루프를 통해 "로컬"변수의 신선한 세트 당신에게 각 시간을 줄 수있는 방법을 보여줍니다

PS> while (1) { $local += 10; Start-Sleep -milli 500; $local } 
10 
20 
30 
40 
PS> while (1) { & {$local += 10; Start-Sleep -milli 500; $local} } 
10 
10 
10 
10 

당신이 정말로 완전히 새로운 실행 영역이 필요한 경우 (글로벌 및 스크립트 변수의 깨끗한 슬레이트), 당신은 루프를 통해 새로운 실행 영역마다 때리기 당신에게 브랜드를 얻을 것이다 대신에 작업을 시작할 수 있지만 반환 한이 좋지 않을 것

while (<loop_condition>) 
{ 
    $job = Start-Job { <path to 1000 line script> } 
    Wait-Job $job 
    Receive-Job $job 
}