Windows PowerShell ISE运行旧版本

12

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

3个回答

9

这是一个很老的问题,但我认为我也遇到了同样的问题。在我的情况下,在调用后定义了一个函数。它似乎起作用,但只是因为“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}

1
哈,这对那些花费大量时间在编译语言上的人来说显然是小问题。 - Spaceman

1

编辑完后,您需要通过点操作来重新源化脚本。假设您在当前目录中有一个名为MyScript.ps1的文件,在控制台中运行以下命令:

. .\MyScript.ps1

如果您想在脚本中调用特定的函数,只需执行以下操作:
. .\MyScript.ps1
MyFunction

0

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

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

A) 我对模块(.PSM1)的经验

  1. 通过ISE加载已放置在正确模块目录“C:\ Users \ MyUserName \ Documents \ WindowsPowerShell \ Modules \ Hello”中的模块文件“hello.psm1”
  2. 通过“运行选择”执行函数(您可能无法通过“运行脚本”执行模块)
  3. 修改文件,例如将函数'Write-Host“Hello World!”'的输出更改为'Write-Host“Hello”'并保存文件。
  4. 通过“运行选择”执行函数,它将执行旧函数,具有旧输出,例如“Hello World!”。如果我重复“运行选择”命令,这也是正确的。
  5. 只有当我离开ISE并再次加载它时,“运行选择”才会执行新函数。

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

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

C)以下是我使模块开发更加舒适的解决方法:

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

因此,如果我在ISE开发中修改模块文件,我总是先执行“运行脚本”,然后再通过“运行选择”执行函数。

通过这种方式,我始终执行当前版本的函数。

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

真诚地 Rolf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接