我有多个powershell脚本,相互调用(像一个链:script1调用script2,后者正在调用另一个...)。我已经无法控制在多个脚本中有多少个局部变量具有相同的名称,所以我得到了不想要的值。你建议在启动每个脚本时,在局部变量中没有值?
我已经找到了这个解决方案,但不确定是最好的:
Remove-Variable * -ErrorAction SilentlyContinue; Remove-Module *; $error.Clear(); Clear-Host
我有多个powershell脚本,相互调用(像一个链:script1调用script2,后者正在调用另一个...)。我已经无法控制在多个脚本中有多少个局部变量具有相同的名称,所以我得到了不想要的值。你建议在启动每个脚本时,在局部变量中没有值?
我已经找到了这个解决方案,但不确定是最好的:
Remove-Variable * -ErrorAction SilentlyContinue; Remove-Module *; $error.Clear(); Clear-Host
1条答案
按热度按时间k7fdbhmy1#
作为一种清理甲板的方式,这可能是一种不错的方式,这取决于你什么时候调用它,以及你在那个会话中做了什么。至少对于变量,你总是可以使用
在使用Remove-Variable之前和之后,查看之前存在哪些变量,之后保留哪些变量,并查看是否有任何意外损失。
例如,如果您使用$profile将任何内容加载到新会话中,则您的方法也可能导致这些内容被清除。
如果变量是在父脚本中创建的,然后从链中的一个脚本调用Remove-Variable *,当脚本链完成并且控制返回到它们的父脚本时,这些脚本将不再访问这些变量。这对你来说可能是个问题,也可能不是,这取决于你在做什么。在Remove-Variable上使用-scope选项可能有助于限制这种影响。
一个不那么全面的方法可能是查看脚本中的变量使用的范围。这些控制变量可以从哪里访问,以及何时销毁。
例如,您是否使用$global:varname,然后使变量在当前PowerShell会话中全局可用,而不仅仅是在当前脚本会话中,而脚本范围中的$varname就可以了?
如果你在第一个脚本和它调用的脚本中都使用了$varname(但可能是出于不同的目的),它将默认定义在Script作用域中,这使得它在当前脚本和任何子脚本中都可用。如果你将其定义为$private:varname,那么它将只存在于当前脚本中,而不会被从它调用的任何子脚本继承。例如,链中的每个脚本都可以定义$private:varname,而一个脚本中设置的值不会影响子脚本或父脚本。
你可以在这里找到一个很好的示波器指南-https://ss64.com/ps/syntax-scopes.html