PowerShell ISE가 스크립트 변수를 스크립트 범위로 격리하지 않는 이유는 무엇입니까?

PowerShell ISE가 스크립트 변수를 스크립트 범위로 격리하지 않는 이유는 무엇입니까?

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

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

여기에 이미지 설명을 입력하세요

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

여기에 이미지 설명을 입력하세요

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

여기에 이미지 설명을 입력하세요

스크립트가 깨끗한 환경에서 시작한다고 가정하는 경우(예: 스크립트 내에 설정된 모든 변수가 이미 존재해서는 안 됩니다.) 이로 인해 스크립트 작성 및 문제 해결이 약간 어려워질 수 있습니다. ISE가 이런 방식으로 동작하는 이유는 무엇입니까?

에 대한 답변이 질문"도트 소싱"을 언급하면서 주제를 약간만 다루지만 여기서는 더 철저한 설명을 듣고 싶습니다. 또한 스크립트가 ISE에서 콘솔과 다르게 실행되는 이유에 대한 문서가 있는 경우 참조도 좋을 것입니다.

답변1

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

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

관련 발췌:

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

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

예를 들어:

Remove-Variable x

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

답변2

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

답변3

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

관련 정보