【问题标题】:Windows PowerShell ISE running old version运行旧版本的 Windows PowerShell ISE
【发布时间】:2013-10-02 03:36:53
【问题描述】:

我正在使用 Windows PowerShell ISE 编写我的 PowerShell 脚本。当我更改脚本中的某些内容并运行脚本时,不会执行最后保存的脚本版本,而是执行旧版本。仅当我第二次运行该脚本时,它才会使用当前版本。我该怎么做才能始终运行最新版本的脚本?

【问题讨论】:

    标签: powershell powershell-ise


    【解决方案1】:

    这是一个非常古老的问题,但我想我偶然发现了同样的问题。就我而言,我在调用它之后定义了一个函数。它似乎可以工作,但这只是因为“myfunc”仍然具有上一次调用的值。如果更改“Hello, World!”,您会发现新值仅在第二次尝试时生效。

    Invoke-Command -ScriptBlock ${function:myfunc}
    
    function myfunc() {
        Write-Host "Hello, World!"
    }
    

    要解决此问题,只需在您尝试调用它之前定义该函数。

    function myfunc() {
        Write-Host "Hello, World!"
    }
    
    Invoke-Command -ScriptBlock ${function:myfunc}
    

    【讨论】:

    • 对于那些将所有时间都花在编译语言上的人来说,这显然是一个令人惊讶的问题。
    【解决方案2】:

    进行编辑后,您需要通过点源再次获取脚本。假设您在当前目录中有一个名为 MyScript.ps1 的文件,请在控制台中运行以下命令:

    . .\MyScript.ps1
    

    如果您想在脚本中调用特定函数,那么您可以这样做:

    . .\MyScript.ps1
    MyFunction
    

    【讨论】:

      【解决方案3】:

      我对 ISE“缓存”旧文件的体验:

      对于 PS 模块 (.psm1) 和简单的 PS 脚本 (ps1),ISE 的行为是不同的。我正在将 PS&ISE 与 Win10Pro 一起使用。

      一) 我的模块经验 (. PSM1)

      1. 加载已放置在正确模块中的模块文件“hello.psm1” 目录 "C:\Users\MyUserName\Documents\WindowsPowerShell\Modules\Hello" by 伊势
      2. 通过“运行选择”执行功能(您可能不执行 模块由“运行脚本”)
      3. 修改文件,例如的输出 函数 'Write-Host "Hello World!"' 到 'Write-Host "Hello"' 并保存 文件。
      4. 通过“运行选择”执行一个函数,它将执行 旧功能,具有旧输出,例如“你好世界!”。这也是真的 如果我重复“运行选择”命令。
      5. 只要我离开 ISE 并再次加载它,新功能就会由“运行选择”执行。

      B) 我的脚本经验 ( .PS1 )。

      1. 如果我执行“运行选择”,与模块的行为相同。
      2. 如果我执行一次“运行脚本”并调用该函数,则执行该函数的当前版本。当然,我在文件“定义”之后(例如在第 10-20 行)调用该函数(例如在第 100 行)。这样,就没有缓存了。
      3. 特别是因此,如果我执行一次“运行脚本”,而执行的代码没有调用该函数,然后通过“运行选择”执行我的函数,则执行当前版本的函数。

      C) 这是使模块开发更舒适的解决方法:

      • 简单的脚本可以通过“运行脚本”来执行。
      • 如果我想开发一个模块 ( .PSM1 ),我在开发阶段将其命名为简单脚本 ( .PS1 )。我已经将文件(例如“hello.ps1”)放入 正确的模块文件夹,例如模块“Hello”的“C:\Users\MyUserName\Documents\WindowsPowerShell\Modules\Hello”。当然,我不能从 PowerShell 控制台将这些函数作为模块函数执行。我只想使用 ISE 调用函数进行测试。
      • 由于模块不作为脚本执行,因此文件中没有可执行代码,而只有函数 (AFAIK)。所以我可以安全地在我的脚本上执行“运行脚本”。

      所以如果我在 ISE 开发下修改模块文件,我总是先执行“运行脚本”,然后再通过“运行选择”执行功能。

      这样我总是执行当前版本的函数。

      虽然我的问题有点不同,但这个问题和答案对我找到解决方案很有帮助。很难找到有关 ISE“缓存”的此类问题以及如此有用的答案。

      真诚的 罗尔夫

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-26
        • 2013-03-15
        • 2018-06-11
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多