PowerShell ISE가 스크립트 변수를 스크립트 범위로 분리하지 않는 이유는 무엇입니까? 지정은 스크립트의 개체 (변수, 별칭, 함수

PowerShell에서 범위 지정은 스크립트의 개체 (변수, 별칭, 함수 등)가 전역 환경에 영향을 미치지 않도록 유지해야합니다. 이것은 명령 줄에서 잘 작동하는 것으로 보이지만 ISE에서는 작동하지 않습니다.

콘솔에 데모가 있습니다. $x전역 범위에 정의되어 있지 않은지 확인하고 내용을 표시 ScopeTest.ps1한 다음 실행 한 다음 마지막으로 $x다시 정의 되어 있는지 확인 합니다. 예상 한대로 $x스크립트 범위 내에서만 작성 및 사용되며 스크립트가 종료 된 후 글로벌 환경에서 유지되지 않습니다.

여기에 이미지 설명을 입력하십시오

ISE에서 콘솔 창을 사용하여 스크립트를 호출하면 이것이 작동하는 것으로 보입니다.

여기에 이미지 설명을 입력하십시오

그러나 실제로 “스크립트 실행”버튼 또는 F5를 사용하면 스크립트 내의 변수가 완료된 후에도 유지됩니다.

여기에 이미지 설명을 입력하십시오

스크립트가 깨끗한 환경에서 시작한다고 가정하면 스크립트 작성 및 문제 해결이 약간 어려워 질 수 있습니다 (예 : 스크립트 내에 설정된 변수가 아직 존재하지 않아야 함). ISE는 왜 이런 식으로 작동합니까?

이 질문에 대한 답변은 “도트 소싱”을 언급하면서 주제에 약간의 영향을 주지만 여기서 더 자세한 설명을 얻고 싶습니다. 또한 ISE에서 스크립트가 콘솔과 다르게 실행되는 이유에 대한 설명서가 있으면 참조도 좋습니다.



답변

스크립트 예제에서 변수를 작성했으며 스크립트 끝에서 변수를 삭제하지 않았습니다. ISE는 실행을 클릭하면 스크립트를로드하고 실행하는 powershell의 라이브 인스턴스를 만듭니다. 차이점은 통합 쉘이 스크립트를 계속할 수 있다는 것입니다. 환경을 디버깅하고 스크립트를 작성하는 데 이상적입니다. 이렇게하면 다음 코드 줄이 작동하도록 스크립트를 계속 반복해서 실행할 필요가 없습니다 (이상적이지 않은 상황이 있습니다). 쉘에 입력하고 작동하면 스크립트 섹션에 추가합니다.

이 동작은 http://technet.microsoft.com/en-us/library/dd819480.aspx에서 가장 잘 설명되어 있습니다.

관련 발췌 :

ISE의 모든 창은 항상 같은 범위에 있습니다.

스크립트가 완료된 후 변수가 쉘에 존재하지 않게하려면 변수를 사용해야 Remove-Variable합니다.

예를 들면 다음과 같습니다.

Remove-Variable x

파일-> 새 Powershell 탭을 클릭하여 ISE에 “깨끗한”powershell 인스턴스를 추가 할 수 있습니다.


답변

ISE에서 Powershell은 기본적으로 스크립트를 셸에 덤프 한 다음 실행합니다. 마치 쉘에 입력 한 것처럼 실행하십시오. 따라서 해당 세션에 변수를 사용할 수 있습니다. 다른 차이점을 보려면이 MSDN 게시물을 확인하십시오 .


답변

따라서 ISE는 글로벌로 범위가 지정됩니다. ISE에서 작업하는 동안 생성 된 모든 변수를 제거하지 않으면 스크립트가 실행 된 후 모든 변수를 사용할 수 있습니다. ISE를 사용하여 스크립트를 작성할 때 항상 다른 PowerShell 콘솔을 열어 놓고 테스트합니다. 이를 통해 내가 의도 한대로 모든 것이 작동하는지 확인할 수 있습니다.


답변