【发布时间】:2016-03-03 09:55:15
【问题描述】:
我有一个带有 .psd1 文件和 .psm1 文件的二进制 PowerShell 模块。 (为什么?Cmdlet 别名和自定义类型加速器,我一辈子都找不到如何在 C# 中执行这些操作。)
现在模块导入并按预期工作,但是当我在 PowerShell 中检查详细输入时。我看到了一些奇怪的东西:
VERBOSE: Loading module from path 'C:\path\to\module\Module.psd1'.
VERBOSE: Loading module from path 'C:\path\to\module\Module.dll'.
VERBOSE: Importing cmdlet 'Cmdlet1'.
VERBOSE: Importing cmdlet 'Cmdlet2'.
VERBOSE: Importing cmdlet 'Cmdlet3'.
VERBOSE: Importing cmdlet 'Cmdlet4'.
VERBOSE: Importing cmdlet 'Cmdlet5'.
VERBOSE: Importing cmdlet 'Cmdlet6'.
VERBOSE: Exporting cmdlet 'Cmdlet1'.
VERBOSE: Exporting cmdlet 'Cmdlet2'.
VERBOSE: Exporting cmdlet 'Cmdlet3'.
VERBOSE: Exporting cmdlet 'Cmdlet4'.
VERBOSE: Exporting cmdlet 'Cmdlet5'.
VERBOSE: Exporting cmdlet 'Cmdlet6'.
VERBOSE: Importing cmdlet 'Cmdlet1'.
VERBOSE: Importing cmdlet 'Cmdlet2'.
VERBOSE: Importing cmdlet 'Cmdlet3'.
VERBOSE: Importing cmdlet 'Cmdlet4'.
VERBOSE: Importing cmdlet 'Cmdlet5'.
VERBOSE: Importing cmdlet 'Cmdlet6'.
这是什么原因造成的,我有什么需要担心的吗?
Psm1 文件
$Accelerators = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators');
# Create accelerators for this module.
$Accelerators::Add('Obj1', 'Company.PowerShell.Module.Object1');
$Accelerators::Add('Obj2', 'Company.PowerShell.Module.Object2');
$Accelerators::Add('Obj3', 'Company.PowerShell.Module.Object3');
...
Set-Alias -Name c1 -Value Cmdlet1
Set-Alias -Name c2 -Value Cmdlet2
...
Psd1 文件
@{
ModuleToProcess = 'Module.psm1'
NestedModules = 'Module.dll'
ModuleVersion = '1.0.0.0'
GUID = 'SOME-GUID-VALUE-HERE'
Author = 'Me'
CompanyName = 'Company'
Copyright = '(c) 2016 Company. All rights reserved.'
Description = 'Module description here.'
PowerShellVersion = '4.0'
DotNetFrameworkVersion = '4.5'
CLRVersion = '4.0'
ProcessorArchitecture = 'Amd64'
PrivateData = @{
Server = 'SOME\SQLSERVERINSTANCE'
Database = 'DatabaseName'
Domain = 'DOMAINNAME'
}
}
【问题讨论】:
-
模块是如何加载的?它是否安装在 PSModulePath 中?可能是它两次加载模块。你检查过这个吗:类似的:stackoverflow.com/questions/34923792/…
-
据我所知,它不在模块路径中。它是从 Visual Studio 构建的调试目录中加载的。
-
关于链接的问题。我在调试文件夹中没有任何子文件夹。我将所有 .dll、.psm1、psd1 和 pdb 文件放在一个目录中。
-
恕我直言,这是因为您首先将 .dll 导入模块,然后将模块导入全局状态。
-
@PetSerAl,那我应该如何导入它?或者看到某些东西被导入两次是正常行为吗?
标签: c# powershell