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

SQLASCmdlets was not loaded because no valid module file was found in any module directory

我有一个脚本由于缺少 SQLASCmdlets 模块而失败。

The specified module 'SQLASCmdlets' was not loaded because no valid module file was found in any module directory.

为了 运行 我知道我需要 SQLPS,我可以使用

找到它

Get-Module -ListAvaiable

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

我已经安装了 - SQL 服务器 2016 - SQL 管理工作室 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

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

  1. 安装 SqlServer 包

https://www.powershellgallery.com/packages/SqlServer/21.0.17199

2.I 已更新我的脚本以选择特定版本以备安装

# 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 会话。

是的,默认情况下未安装 SQLPS 模块 - 您有 2 个选择:

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

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

SQL2016 和 SQL2017 安装中似乎缺少模块 SQLASCmdlet。它是在 SQL 2014 年所以我查看了这个模块中有哪些命令,下面是列表:

添加角色成员 备份-ASDatabase 调用-ASCmd 调用-ProcessCube 调用过程维度 调用-ProcessPartition 合并分区 新建 RestoreFolder 新的恢复位置 删除角色成员 恢复 ASDatabase

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

一旦你打开它,你会看到它试图加载模块的位置 SQLASCmdlets 所以只要注释掉这一行就可以了。有人需要告诉 Microsoft 他们忘记将此模块与他们的 SQL 安装包一起运送