PowerShell:脚本模块变量在ISE之外不可用

bou*_*rne 4 powershell

我一直在努力更新我写的一些脚本.我还在学习PowerShell,所以我想回到原来的那些,看看能否改进.
我偶然发现了模块,并且非常喜欢使用它们存储可以随时调用的不同操作的想法.

我写了一个简单的脚本来测试(或者我认为).我应该提到我将我的模块存储在服务器共享上.

Write-Host "Testing for available variables"
Write-Host "Loading Modules"
Import-Module <path to my module on server share>.psm1
Write-Host ""
Write-Host "Done"
Write-Host "Print loaded modules"
Get-Module
Write-Host ""
Write-Host "Done"
Write-Host "================="
Write-Host ""
Write-Host "Printing variables"
Write-Host ""
Write-Host "Variable: arch: " $arch
Write-Host "Variable: WowNode: " $WowNode
Write-Host ""
Write-Host "Done"
Run Code Online (Sandbox Code Playgroud)

我的模块包含

If ( "${env:ProgramFiles(x86)}" -ne "" )
 {
    $script:arch = 64
    $script:WowNode = "\Wow6432Node\"
 }
 ELSE
 {
    $script:arch = 32
    $script:WowNode = "\"
 }
Run Code Online (Sandbox Code Playgroud)

当我使用Windows Powershell ISE运行我的脚本时,一切都按照我的想法发挥作用.我看到变量的内容并正确打印出来.
当我从Powershell命令行窗口运行我的脚本时,模块被加载,但变量是空白的(没有打印出来).
我一直在挖掘谷歌,我看到的唯一可能是因为这与我用来定义我的变量的范围有关.
将它们定义为$ script:xx将它们放入Global范围(我很确定),这使它们在整个脚本中可用.所以我认为我正确地定义了我的变量.但我还没有运气.

我可能错过了一些明显的东西,但对于我的生活,我找不到它.
关于我可以做些什么来解决这个问题的任何建议?
我已经确认我正在运行PowerShell 2.0版,因为我读到模块仅在2.0版中可用.

Fro*_* F. 10

从我现在能想到的(没有测试),问题是你所说的范围.在ISE和控制台中运行脚本之间存在差异.我猜你在ISE中运行脚本时,打开脚本并按下运行按钮.这将在控制台中逐行执行脚本,如果您直接在控制台中键入它们.这使得脚本本身在global(会话)变量范围内运行.由于脚本已经存在global,因此您的模块将是唯一一个在script范围内运行的模块.

但是,在PowerShell控制台中运行脚本时; 喜欢:

PS > .\myscript.ps1
Run Code Online (Sandbox Code Playgroud)

然后您的脚本在script范围内运行(脚本完成后将删除每个变量).现在,模块将在它自己的script范围内运行,低于你的mainscript运行的范围.当模块完成导入后,模块的script范围被删除,你的主脚本将查看它自己的范围,你的变量做什么不存在.

Global (session)
 - Script (mainscript)
   - Script (module)
     #Module completes, and scope is deleted
   #You look for $script:arch , which was actually deleted right above.
   #Powershell searches through the mainscript's scope, but finds nothing.
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请尝试将值存储在global(会话)范围中,如下所示$global:arch.global在创建变量(必需)时以及从中读取时(建议)指定范围.

  • 超级解释,顺便说一句! (2认同)
  • 抱歉,请忽略我上面关于使用“-Global”参数的评论。这实际上不起作用。我的测试有问题。对困惑感到抱歉! (2认同)