未加载SQLASCmdlets,因为在任何模块目录中找不到有效的模块文件

时间:2017-12-19 15:32:47

标签: powershell powershell-v5.0

我的脚本由于缺少SQLASCmdlets模块而失败。

  

未加载指定的模块“SQLASCmdlets”,因为无效   模块文件在任何模块目录中找到。

为了运行它,我知道我需要使用

找到的SQLPS
  

Get-Module -ListAvaiable

ModuleType Version    Name
---------- -------    ---- 
Manifest   1.0        SQLPS 

我已安装   - SQL Sever 2016   - SQL Management Studio 2017

错误:

VERBOSE: ******************************
VERBOSE: The specified module 'SQLASCmdlets' was not loaded because no valid module file was found in any module directory.
VERBOSE: Errors: 1
VERBOSE: ******************************
VERBOSE: System.IO.FileNotFoundException: The specified module 'SQLASCmdlets' was not loaded because no valid module file was found in any module directory.
VERBOSE: ScriptHalted The specified module 'SQLASCmdlets' was not loaded because no valid module file was found in any module directory.

当我再次重新运行我的脚本时,它可以工作。我如何让它第一次运作?

我使用的代码是:

Import-Module "SQLPS" -DisableNameChecking


$sqlsvr = New-Object -TypeName  Microsoft.SQLServer.Management.Smo.Server("WIN-C0BP65U3D4G")
$restore = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Restore
$devicetype = [Microsoft.SqlServer.Management.Smo.DeviceType]::File

$files = gci C:\psbackups

$BackupFiles = @()

foreach ($file in $files){
    $restoredevice = New-Object -TypeName Microsoft.SQLServer.Management.Smo.BackupDeviceItem($file.FullName,$devicetype)

    $restore.Devices.add($restoredevice)
    $errcnt=0
    try{
        $restore.ReadMediaHeader($sqlsvr)
    }
    catch [System.Exception]{
        Write-Output "$file is not a sql backup file `n"
        $errcnt =1
    }
    finally {
        if ($errcnt -ne 1){
            Write-Output "$file is a sql backup file `n"
            $BackupFiles += $file
        }
        $errcnt = 0
    }
    $restore.Devices.remove($restoredevice)
    Remove-Variable restoredevice
}

基于这篇文章 PowerShell to restore database

3 个答案:

答案 0 :(得分:1)

经过2个小时的研究,我找到了解决方案。

  1. 安装SqlServer包
  2. https://www.powershellgallery.com/packages/SqlServer/21.0.17199

    2.我已更新我的脚本,以便在安装时选择特定版本

    # import modules 
    if ((Get-Module -ListAvailable | where-object {($_.Name -eq 'SqlServer') -and ($_.Version.Major -gt 20) } |Measure).Count -eq 1){
        # implementation of new sql modules migated into new location
        Import-Module SqlServer -DisableNameChecking -Verbose
    }
    else{
        # fallback for SQLPS 
        Import-Module SQLPS -DisableNameChecking -Verbose
    }
    
    1. 确保我有PowerShell的新会话。

答案 1 :(得分:0)

是默认情况下未安装SQLPS模块 - 您有两个选项:

1)安装模块 2)安装SSMS - MSSQL管理的标准工具。

此外,如果您安装了32位SSMS,如果运行默认的64位PowerShell或运行32位,则需要显式添加模块。

答案 2 :(得分:0)

SQL 2016和SQL 2017安装中似乎缺少模块SQLASCmdlets。它是关于SQL 2014的,所以我查看了这个模块中的命令,这里是列表:

添加-RoleMember 备份 - ASDatabase 调用-ASCMD 调用-ProcessCube 调用-ProcessDimension 调用-ProcessPartition 合并分区 新RestoreFolder 新RestoreLocation 删除 - RoleMember 还原 - ASDatabase

因此,如果您不需要此模块中的任何这些cmdlet,我们可以通过注释掉尝试加载它的行来阻止显示错误。我使用的是SQL 2017,所以我的文件位置是 C:\ Program Files(x86)\ Microsoft SQL Server \ 140 \ Tools \ PowerShell \ Modules \ SQLPS \ SqlPsPostScript.PS1

一旦你打开它,你会看到它试图加载模块SQLASCmdlets的位置,所以只需注释这一行,你应该是好的。有人需要告诉微软他们忘了带这个模块发布他们的SQL安装包