Windows PowerShell ISE изпълнява стара версия

Пиша моите PowerShell скриптове с Windows PowerShell ISE. Когато променя нещо в скрипта и стартирам скрипта, не се изпълнява последната запазена версия на скрипта, а по-старата. Само ако стартирам скрипта втори път, той използва текущата версия. Какво мога да направя, за да стартирам винаги най-новата версия на скрипта?


person jlai    schedule 26.09.2013    source източник


Отговори (3)


Това е много стар въпрос, но мисля, че се натъкнах на същия проблем. В моя случай дефинирах функция, след като я извиках. Изглежда, че работи, но само защото "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}
person Boinst    schedule 02.12.2015
comment
Ха невероятно явно хълцане за хората, прекарващи цялото си време в компилирани езици. - person Spaceman; 21.11.2018

След като направите редакция, трябва отново да посочите източника на скрипта, като го посочите с точка. Ако приемем, че имате файл с име MyScript.ps1 в текущата директория, в конзолата изпълнявате командата по-долу:

. .\MyScript.ps1

Ако искате да извикате конкретна функция в скрипта, можете просто да направите:

. .\MyScript.ps1
MyFunction
person dcarson    schedule 22.11.2013

Моят опит с ISE "кеширане" на стари файлове:

Поведението на ISE е различно за PS модули (.psm1) и прости PS скриптове (ps1). Използвам PS&ISE с Win10Pro.

A) Моят опит с модули ( . PSM1 )

  1. Заредете модулен файл "hello.psm1", който вече е поставен в правилна модулна директория "C:\Users\MyUserName\Documents\WindowsPowerShell\Modules\Hello" от ISE
  2. Изпълнете функция чрез „Изпълнение на селекция“ (не можете да изпълнявате модули чрез „Изпълнение на скрипт“)
  3. Променете файла, напр. изхода на функцията „Write-Host „Hello World!““ към „Write-Host „Hello““ и запазете файла.
  4. Изпълнете функция чрез „Изпълнение на избор“ и тя ще изпълни старата функция със стар изход, напр. "Здравей свят!". Това също е вярно, ако повторя командата "Изпълни селекцията".
  5. Просто ако напусна ISE и го заредя отново, новата функция се изпълнява от "Run Selection".

B) Моят опит със скриптове (.PS1).

  1. Ако изпълня "Run Selection", същото поведение като при модулите.
  2. Ако изпълня веднъж "Run Script" и по този начин функцията бъде извикана, текущата версия на функцията се изпълнява. Разбира се, аз извиквам функцията (напр. на ред номер 100) във файла „след като“ е дефинирана (напр. на редове 10-20). По този начин няма кеширане.
  3. Особено и следователно, ако изпълня веднъж „Run Script“, докато изпълненият код не извиква функцията, и след това изпълня моята функция чрез „Run Selection“, текущата версия на функцията се изпълнява.

C) Ето моето решение, за да направя разработването на модули по-удобно:

  • Простите скриптове могат да се изпълняват чрез „Изпълнение на скрипт“.
  • Ако искам да разработя модул (.PSM1), аз го наричам обикновен скрипт (.PS1) по време на фазата на разработка. Поставям файла (напр. "hello.ps1") вече в правилната папка на модула, напр. „C:\Users\MyUserName\Documents\WindowsPowerShell\Modules\Hello“ за модул „Hello“. Разбира се, поради това не мога да изпълня функциите като модулни функции от конзолата на PowerShell. Просто искам да използвам ISE за извикване на функции за тестване.
  • Тъй като модулите не се изпълняват като скрипт, във файла няма изпълним код, а само функции ( AFAIK ). Така че мога безопасно да изпълня "Изпълни скрипт" на моя скрипт.

Така че, ако модифицирам модулен файл при разработка на ISE, винаги първо изпълнявам "Run Script", преди да изпълня функция чрез "Run Selection".

По този начин винаги изпълнявам текущата версия на функция.

Въпреки че проблемът ми беше малко по-различен, този въпрос и отговорите ми бяха много полезни за намирането на решение. Трудно е да се намерят такива въпроси относно ISE "кеширането" и толкова полезни отговори.

С уважение Ролф

person Rolf Hemmerling - user3283760    schedule 12.08.2016