我有一个 .sql文件.我试图通过Powershell脚本传递连接字符串详细信息并调用.sql文件.
我正在搜索并想出了一个与之相关的cmdlet Invoke-sqlcmd.当我试图找到一个与SQL相对应的模块时,我在我的机器中找不到任何一个模块.
我应该在我的机器中安装任何东西(机器已经有SQL Server Management Studio 2008 R2)来获取模块,还是有简单的方法.sql使用Powershell 执行文件?
我创建了一个模块'ActiveDirectory.psm1',其中包含powershellv5中的一个类.我将该模块导入另一个名为"test.ps1"的文件中,然后从该类中调用一个方法.
test.ps1包含以下内容:
using module '\\ser01\Shared\Scripts\Windows Powershell\modules\ActiveDirectory\ActiveDirectory.psm1'
Set-StrictMode -version Latest;
$AD = [ActiveDirectory]::New('CS');
$AD.SyncGroupMembership($True);
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作但是当我对ActiveDirectory.psm1进行更改并保存更改时,它们不会立即反映出来.即如果ActiveDirectory.psm1包含:
write-verbose 'do something';
Run Code Online (Sandbox Code Playgroud)
如果我改变它
write-verbose 'now the script does something else';
Run Code Online (Sandbox Code Playgroud)
输出仍然是"做某事"
我猜它已经将模块存储在内存中并且没有重新加载它因此错过了我所做的更改.我需要运行什么命令才能加载最新保存的模块版本?
我们在一个部署PowerShell脚本中使用了一些PowerShell模块.使用以下命令,我们将模块(即XXXX)安装到"C:\ Program Files\WindowsPowerShell\Modules"中.
Install-Module -Name "XXXX" -AllowClobber -RequiredVersion "XXXX" -Repository "XXXX" -Scope AllUsers
Run Code Online (Sandbox Code Playgroud)
现在,一旦我们使用了此模块的功能,我们将使用以下命令在部署脚本结束时将其卸载.
Remove-Module -Name "XXXX" -force
Uninstall-Module -Name "XXXX" -AllVersions -force
Run Code Online (Sandbox Code Playgroud)
但是此卸载模块命令会出现以下错误.
WARNING: The version '###' of module 'XXXX' is currently in use. Retry the operation after closing the
applications.
PackageManagement\Uninstall-Package : Module 'XXXX' is in currently in use.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:2046 char:21
+ ... $null = PackageManagement\Uninstall-Package @PSBoundParameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Microsoft.Power...ninstallPackage:UninstallPackage) [Uninstall-Packag
e], Exception
+ FullyQualifiedErrorId : ModuleIsInUse,Uninstall-Package,Microsoft.PowerShell.PackageManagement.Cmdlets.Uninstall
Package
Run Code Online (Sandbox Code Playgroud)
有人有任何想法解决这个问题吗?
有没有办法使用在远程会话中的本地会话中导入的模块?我查看了import-pssession,但我不知道如何获得本地会话.这是我想要做的样本.
import-module .\MyModule\MyModule.ps1
$session = new-pssession -computerName RemoteComputer
invoke-command -session $session -scriptblock { Use-CmdletFromMyModule }
Run Code Online (Sandbox Code Playgroud)
另外,我不想在远程会话中导入模块,因为ps1文件不在该服务器上.
有一个问题在这里;)
我有这个功能:
function Set-DbFile {
param(
[Parameter(ValueFromPipeline=$true)]
[System.IO.FileInfo[]]
$InputObject,
[Parameter(ValueFromPipelineByPropertyName=$true)]
[scriptblock]
$Properties
)
process {
$InputObject | % {
Write-Host `nInside. Storing $_.Name
$props = & $Properties
Write-Host ' properties for the file are: ' -nonew
write-Host ($props.GetEnumerator()| %{"{0}-{1}" -f $_.key,$_.Value})
}
}
}
Run Code Online (Sandbox Code Playgroud)
看看$Properties.应对每个文件进行评估,然后进一步处理文件和属性.
示例如何使用它可能是:
Get-ChildItem c:\windows |
? { !$_.PsIsContainer } |
Set-DbFile -prop {
Write-Host Creating properties for $_.FullName
@{Name=$_.Name } # any other properties based on the file
}
Run Code Online (Sandbox Code Playgroud)
当我将函数复制并粘贴Set-dbFile到命令行并运行示例代码段时,一切都很好.
但是,当我将函数存储在模块中,导入它并运行该示例时,该$_ …
我正在通过Octopus Deploy将PowerShell模块安装到许多不同的服务器上.出于测试目的,我在Microsoft的文档指导下安装了PowerShell模块.
这工作正常,但正如文档所述,我的更改仅在当前会话中可见.也就是说,如果我要做以下事情:
$modulePath = [Environment]::GetEnvironmentVariable("PSModulePath", [EnvironmentVariableTarget]::Machine)
# More practically, this would be some logic to install only if not present
$modulePath += ";C:\CustomModules"
[Environment]::SetEnvironmentVariable("PSModulePath", $modulePath, [EnvironmentVariableTarget]::Machine)
Run Code Online (Sandbox Code Playgroud)
在触手服务器上自动运行此安装程序时,未来的PowerShell会话似乎看不到新安装的模块.
如何以与配置文件无关的方式安装PowerShell模块,以便启动的每个PowerShell会话都能看到它?
我正在开发一个PowerShell v3模块,它需要使用一些外部.NET程序集中包含的类型.
我希望这个模块能够合理地自包含,以便于部署,我不想依赖于在GAC中加载这些程序集.理想情况下,我想将所需的程序集dll放在模块文件夹中,然后依赖PowerShell在加载模块时自动加载这些程序集.
我知道我可以使用Add-Type命令来强制加载程序集,如下所示:
Add-Type -AssemblyName "Some.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=sometoken"
Run Code Online (Sandbox Code Playgroud)
但我已经阅读了模块清单中所需的程序集属性,我希望这种方法可以消除看似脆弱的Add-Type代码:
# Assemblies that must be loaded prior to importing this module
# RequiredAssemblies = @()
Run Code Online (Sandbox Code Playgroud)
在模块中引用外部组件的最可靠方法是什么?在模块加载时,声明清单中的依赖项会隐式加载程序集吗?如果我利用模块清单列出所需的程序集,我仍然需要编写加载程序集的代码吗?
我真的不是在寻找一个简单的"让它工作"的解决方案,因为我已经使用Add-Type方法实现了这一点......我正在寻找最可靠的方法来做到这一点的指导和建议.
我有一个PowerShell模块,它封装了许多常用的业务功能.通常不会从控制台调用它; 相反,它的功能由导入模块的自动部署和管理脚本调用.
该模块包含一个记录功能,可以写入集中式日志记录位置.我还想加入Write-Verbose功能来写入控制台.
#'Start Script.ps1
#'----------------
Import-Module Corporate
Write-Logger 'Foo'
Run Code Online (Sandbox Code Playgroud)
我的限制是 - 在Corporate PowerShell模块中 - 我需要确定是否已使用-Verbose参数调用Script.ps1 .理想情况下,我希望确定代码完全在模块本身内.
这是一个例子:
[CmdletBinding()]
Param ()
New-Module -Name TempModule -ScriptBlock {
function Test-ModuleVerbose() {
[CmdletBinding()]
Param ()
PROCESS {
$vb = ($PSCmdlet.MyInvocation.BoundParameters['Verbose'] -eq $true)
Write-Host ("1: Module verbose preference: " + ($PSCmdlet.MyInvocation.BoundParameters['Verbose'] -eq $true))
Write-Host ("2: Module verbose preference: " + $Script:VerbosePreference)
Write-Host ("3: Module verbose preference: " + $VerbosePreference)
}
}
} | Out-Null
function Test-Verbose() {
[CmdletBinding()]
Param () …Run Code Online (Sandbox Code Playgroud) 我已经有一段时间了.我打算为我的项目创建新的PowerShell模块.目标是将多个自定义cmdlet打包到独立单元中,我可以通过我们的Nexus存储库(或通过其他任何方式)将其部署到其他计算机.
问题:我看到的每个地方,都看到教程将所有PowerShell函数/ cmdlet打包成单个*.psm1文件.文件存储在同名目录中,实际上代表模块本身.
问题:有没有办法,如何将每个cmdlet /函数分成独立文件?如果我有一个由几个cmdlet组成的模块,将它们全部放在单个*.psm1文件中并不是很方便.
谢谢马修
我在模块中定义了枚举类型.如何在模块加载后将其导出为可从外部访问?
enum fruits {
apple
pie
}
function new-fruit {
Param(
[fruits]$myfruit
)
write-host $myfruit
}
Run Code Online (Sandbox Code Playgroud)
我的高级函数使用枚举而不是ValidateSet枚举可用的枚举,但如果不可用则失败.
更新: 将它分成ps1并点源(ScriptsToProcess),但我希望有一种更清洁的方式.
powershell ×10
cmdlet ×1
cmdlets ×1
enums ×1
module ×1
scope ×1
sql ×1
sql-server ×1
uninstall ×1
variables ×1