【发布时间】:2017-03-16 15:18:14
【问题描述】:
我创建了一个名为“Application”的类并将其加载到我的主脚本中:
Import-Module -NAME "C:\PowerShell_Scripts\Class\Application.ps1" -GLOBAL -FORCE;
但是,如果我仅更改类文件并在 PowerShell ISE 中运行代码,则不会应用任何更改。即使我使用了 -FORCE,就好像该类仍在内存中。
我也尝试在加载模块之前删除它,但同样的问题发生了:
Remove-Module "Application" -ErrorAction Ignore -FORCE;
Import-Module -NAME "C:\PowerShell_Scripts\Class\Application.ps1" -GLOBAL -FORCE;
如果我在我的主脚本中更改了单个字符,那么它会重新加载类!但是我不应该修改主脚本来强制 PowerShell 重新加载类,这看起来很傻。
有没有办法从内存中删除 Application 类(如果存在)?
注意:仅包含函数的文件是工作文件。这仅适用于类导入。
添加:在控制台中,如果我运行 Remove-Module 命令,它会成功运行,但我仍然可以使用以下命令创建新对象:
$appDetails = [Application]::new($applicationID);
对我来说没有意义......
主脚本:
# Application Details
# -----------------
#ID
$applicationID = 1;
############################################
#
# Load Supporting Scripts
#
############################################
try
{
Remove-Module "Application" -ErrorAction Ignore -FORCE;
Remove-Module "Common" -ErrorAction Ignore -FORCE;
Remove-Module "ServerData" -ErrorAction Ignore -FORCE;
Import-Module -NAME "C:\PowerShell_Scripts\Common.ps1" -GLOBAL -FORCE;
Import-Module -NAME "C:\PowerShell_Scripts\ServerData.ps1" -GLOBAL -FORCE;
Import-Module -NAME "C:\PowerShell_Scripts\Class\Application.ps1" -GLOBAL -FORCE;
}
catch
{
Write-Host "`nError: Cannot load required PowerShell scripts. Ensure C:\PowerShell_Scripts\ exists and has the required files." -ForegroundColor Red;
EXIT;
}
############################################
#
# Load the SharePoint Snapin Module.
#
############################################
LoadSharePointModule;
############################################
#
# Display component details to user.
#
############################################
#Create object of "Application" to get app details based on the ID.
$appDetails = [Application]::new($applicationID);
Write-Host "Ending ......";
应用类文件
Class Application
{
#Class Properties
[STRING] $appName;
[INT32] $appID;
[INT32] $versionMajor;
[INT32] $versionOS;
[INT32] $versionCentraAdmin;
[INT32] $versionMain;
[INT32] $versionGUI;
[INT32] $versionWorkflow;
[INT32] $versionForm;
[INT32] $versionVS;
[INT32] $versionOther;
[INT32] $versionFull;
[OBJECT] $spDevSite;
[OBJECT] $versionList;
#Constructor: Setup class properties.
Application ([INT32] $appID)
{
Write-Host "`nGathering application details ..." -ForegroundColor Yellow;
try
{
#Get the SharePoint Developer site Object.
$this.spDevSite = Get-SPWeb -ErrorAction Stop $GLOBAL:spDevURL;
}
catch
{
Write-Host "`nUnable to connect to SharePoint Developer site!: $($GLOBAL:spDevURL)";
#EXIT;
}
#Assign class property.
$this.appID = $appID;
}
}
我特意设置了 $GLOBAL:spDevURL; 的 URL;以便构造函数在此测试中失败。正常失败并显示
Write-Host "`nUnable to connect to SharePoint Developer site!: $($GLOBAL:spDevURL)";
但如果我对此行进行更改并运行脚本,则不会应用更改。
【问题讨论】:
-
如果您运行包含
Import命令的脚本两次,是否会发生同样的事情?我注意到第一次运行时的行为与您相同,但再次运行脚本后,它似乎更新了 -
不,如果我对 Application 类文件进行更改,然后运行主脚本 100 次,它将永远不会显示更改。但是,如果我在主脚本的任何地方都有一个字符(如注释),那么它会刷新并正确加载新类。
-
无法在会话中重新加载课程 - 请参阅 stackoverflow.com/a/36812564/1368849
-
是的,看起来不错。更改为 $appDetails = New-Object -ErrorAction Stop Application($applicationID) 效果很好。
标签: class powershell