标签: powershell-module

`PowerShellVersion`和`PowerShellHostVersion`之间的区别

摘要

PowerShell模块清单值PowerShellVersionPowerShellHostVersion?之间的区别是什么?

长版

创建新模块清单时,此模块所需的PowerShell最低版本以及所需的PowerShell主机的最低版本都有设置.即

New-ModuleManifest -Path '.\MyModule.psd1' -PowerShellVersion '5.0' -PowerShellHostVersion '2.0'

PowerShellVersion涉及$PSVersionTable.PSVersion.Major(NB:与主要版本有关,因为有效值都为其次要版本/没有构建或修订版号设置了0).

PowerShellHostVersion是我不清楚的那个.我的信念是,这与$Host.Version(即与之PowerShellHostName相关$Host.Name)有关.但是,根据我的经验,ISE(Windows PowerShell ISE Host)和ConsoleHost版本号都与PS版本一致; 因此,要求这些与PS版本不同步似乎很奇怪,如示例中所暗示的那样.我希望这些很少用于罕见用例的参数; 但是我想确保我已经正确理解了这些用途,以及是否存在适用的常见情况.

在这个例子值MSDN文档不同(即PowershellVersion给定5.0,而PowershellHostVersion获得2.0)

官方文档只给出了一个圆形的说明(即增加不超过参数名称本身就意味着更多的信息).

powershell manifest powershell-module

6
推荐指数
1
解决办法
482
查看次数

我可以从Export-ModuleMember中排除单个函数吗?

我在PowerShell脚本模块中定义了大量函数.我想使用Export-ModuleMember -Function *,但我想只排除一个函数.排除这一功能比列出所有包含的功能更容易.反正有没有实现这个目标?

powershell powershell-module

5
推荐指数
3
解决办法
1198
查看次数

Powershell使用Import-Module运行脚本

我为我的管理组创建了一个模块,其中包含一些自动执行我们常用程序的功能(将管理员添加到远程计算机,C驱动器清理等等)

这些功能的先决条件之一是生成一系列7个凭证,每个凭据用于我们工作的每个域.

有没有办法在导入模块时让脚本块运行,或者这是我应该添加到每个人员配置文件的东西?

一位评论者提到我可以将它添加到module.psm1文件中,但这不起作用.这是我试图运行的代码.

$creds = Import-Csv [csvfile]
$key = Get-Content [keyfile]
foreach ($cred in $creds) {
    $user = $cred.User
    $password = $cred.Hash | ConvertTo-SecureString -Key $key
    $i = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$password
    New-Variable -Name ($cred.Domain + "_Cred") -Value $i -Force
    }
Run Code Online (Sandbox Code Playgroud)

手动运行此工作正常,但从Import-Module命令运行时不会创建凭据.

powershell powershell-module

5
推荐指数
2
解决办法
3472
查看次数

我可以将 CSV 文件打包为模块资源吗

我有一个带有相应模块清单的自定义 PowerShell 模块。在我的模块中的一个命令中,我有一个硬编码的哈希表数组。一开始这很好,但有时我不得不回去向这个硬编码数组添加新的哈希表,并且数组变得很长。以这种方式管理这些数据变得越来越困难。我真正想做的是将此集合移出到外部资源(例如 CSV 文件)中,并让命令从 CSV 文件中读取数据。实际上,这是我从一开始就喜欢的,但直到现在才变得足够痛苦,以至于我不得不弄清楚如何做到这一点。

我的问题是我将如何做这件事?或者甚至可以做到吗?我已经阅读了很多关于模块清单的内容,但我不记得读过任何描述在清单文件中指定附加资源的方法或如何以对模块“私有”的方式加载这些资源的任何内容。我想我可以将 CSV 文件与所有其他 PowerShell 文件一起放在模块的文件夹中,然后也许我可以找到它,$PSScriptRoot但这似乎不是很“官方”(而且我不是 100% 确定它会起作用)。另外,通过这样做,清单中没有任何内容会向其他人暗示模块正常运行需要其他资源。

对于这样的事情是否有最佳实践,或者我是不是完全错了?

powershell powershell-module

5
推荐指数
1
解决办法
358
查看次数

PowerShell 使用第三方模块而不安装它

我相信这是可能的,但找不到任何有用的东西。我写了一个局域网扫描仪脚本。为了尽可能自动化,我不依赖用户的任何输入。该脚本会检查本地接口 IP 地址并使用缩进网络工具模块来计算可能的 IP 地址和每次 ping 的数量。

问题是因为我使用的是第三方工具,所以我必须将它安装在我想使用这个脚本的任何机器上。有没有办法可以在我的脚本中包含这个第三方模块,比如将它们放在同一个文件夹中而不必单独安装?

powershell powershell-module

5
推荐指数
1
解决办法
2666
查看次数

PowerShell项目,全局设置放在哪里?

我们正在使用 PowerShell(帮助我们设置一些 SharePoint 环境/租户的脚本/函数的集合)构建一个更大的项目。

许多功能应该重用存储在单个中央位置的设置。

我找不到如何最好地创建和构建此类设置文件/位置的“最佳实践”。

我的想法是将全局设置存储在单独的文件(模块文件)中,例如Settings.psm1 ,其内容如下:

# Set vars
$global:scriptEnvironment = "SP2016HOSTINGDEV"
$global:logFileName = "z_Migration_to_SP2016.log"
$global:languageMapping = @{
    "en-US" = 1;
    "de-DE" = 2;
}
$global:oldWsps = @(
    [WspFile]@{ Filename = "comapany.solution.wsp"; IsDeployable = $true; IsGloballyDeployable = $false; FullTrustBinDeployment = $false },
    [WspFile]@{ Filename = "company.solution2.server.wsp"; IsDeployable = $true; IsGloballyDeployable = $false; FullTrustBinDeployment = $false }
)
...
Run Code Online (Sandbox Code Playgroud)

在其他模块/脚本中,我总是可以包含如下设置:

# Set vars
$scriptDirectory = Split-Path -parent $PSCommandPath

# Module import
Import-Module (Join-Path $scriptDirectory Settings.psm1) -Force -ErrorAction …
Run Code Online (Sandbox Code Playgroud)

powershell settings global-variables project-structure powershell-module

5
推荐指数
1
解决办法
3160
查看次数

作为参数传递给模块函数时,Scriptblock 未获得管道变量绑定

我想把这个功能

function Test-Any {
    [CmdletBinding()]
    param($EvaluateCondition,
        [Parameter(ValueFromPipeline = $true)] $ObjectToTest)
    begin {
        $any = $false
    }
    process {
        if (-not $any -and (& $EvaluateCondition $ObjectToTest)) {
            $any = $true
        }
    }
    end {
        $any
    }
}
Run Code Online (Sandbox Code Playgroud)

到一个模块中。我刚刚创建了一个新模块 my-scripts.psm1 文件,其中仅包含上述函数并使用Import-Module <absolute path>.

问题是,如果我使用模块中的函数1..4 | Test-Any { $_ -gt 3 }会返回 false,因为$_未设置为来自管道的值。

如果我在脚本中正常定义该函数并从那里使用它,它会按预期工作(为 $_ 分配整数值)。

Windows 7 下的 PowerShell v4.0 会发生这种情况。

powershell module powershell-module powershell-4.0

4
推荐指数
1
解决办法
264
查看次数

Powershell 不从模块导入函数

我正在尝试在此处设置 NuGet Feed,效果很好。我通过我的提要安装了一个模块

Install-Module -Name MyCmdlets -Repository $RepoName -Scope CurrentUser -Force
Import-Module -Name MyCmdlets
Run Code Online (Sandbox Code Playgroud)

但是,当我运行 Get-Module 时,我没有任何功能,它是一个清单?

ModuleType Version    Name                                ExportedCommands                                  
---------- -------    ----                                ----------------                                  
Manifest   1.0        MyCmdlets          
Run Code Online (Sandbox Code Playgroud)

如果我手动转到安装位置并手动导入

Import-Module <my-path>\1.0\MyCmdlets.psm1                 

ModuleType Version    Name                                ExportedCommands                                  
---------- -------    ----                                ----------------                     
Script     0.0        MyCmdlets                      {Create-Project, Get-AuditLogs, Get-..             
Run Code Online (Sandbox Code Playgroud)

我的清单文件确实有这些行,所以我不明白为什么Import-Module不能正常工作。

FunctionsToExport = '*'

CmdletsToExport = '*'

powershell cmdlets module powershell-module powershellget

4
推荐指数
1
解决办法
3202
查看次数

无法将参数绑定到参数,因为它是一个空字符串

从我创建并导入到主脚本中的模块调用函数时出现此错误:

 Run-RemoteScript : Cannot bind argument to parameter 'Targets' because it 
is an empty string.
At C:\Scripts\Script.ps1:114 char:39
+             Run-RemoteScript -Targets $targets -RunMethod $runMethod  ...
+                                       ~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [Run-RemoteScript], 
ParameterBindingValidationException
+ FullyQualifiedErrorId : 
ParameterArgumentValidationErrorEmptyStringNotAllowed,Run-RemoteScript`
Run Code Online (Sandbox Code Playgroud)

在我的模块中,-Target被定义为这样的参数:

[Parameter(Mandatory, Position = 0)][String[]]$Targets,
Run Code Online (Sandbox Code Playgroud)

在我的主脚本(导入我的模块)中,$targets定义如下:

$Targets = Set-TargetList
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用global脚本范围,但这不起作用。

powershell powershell-module

4
推荐指数
1
解决办法
6569
查看次数

如何将 Chocolatey 函数、核心和扩展导入 PowerShell 会话?

我发现很多Chocolatey辅助函数:

C:\ProgramData\chocolatey\helpers\functions
Run Code Online (Sandbox Code Playgroud)

和扩展功能

C:\ProgramData\chocolatey\extensions\chocolatey-core
Run Code Online (Sandbox Code Playgroud)

当您开发甚至非Chocolatey软件包时非常有用。有没有办法将这些函数导入Powershell脚本和Powershell控制台会话?

powershell powershell-module chocolatey

4
推荐指数
1
解决办法
2838
查看次数