11

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

4

3 回答 3

8

这是一个非常古老的问题,但我想我偶然发现了同样的问题。就我而言,我在调用它之后定义了一个函数。它似乎可以工作,但这只是因为“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}
于 2015-12-02T06:21:11.480 回答
1

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

. .\MyScript.ps1

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

. .\MyScript.ps1
MyFunction
于 2013-11-22T00:01:44.377 回答
0

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

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

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”)放在正确的模块文件夹中,例如模块“Hello”的“C:\Users\MyUserName\Documents\WindowsPowerShell\Modules\Hello”。当然,我不能从 PowerShell 控制台将这些函数作为模块函数执行。我只想使用 ISE 调用函数进行测试。
  • 由于模块不作为脚本执行,因此文件中没有可执行代码,而只有函数(AFAIK)。所以我可以安全地在我的脚本上执行“运行脚本”。

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

通过这个我总是执行一个函数的当前版本。

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

真诚的罗尔夫

于 2016-08-12T08:10:18.280 回答