6

我从未见过如此简单的脚本如此失败:

$SQLServer = "localhost"
$cred = Get-Credential
invoke-sqlcmd -ServerInstance $SQLServer -Credential $cred -Query "select @@version"

在此处输入图像描述

短语说不-Credentials被识别:

Invoke-Sqlcmd : A parameter cannot be found that matches parameter name 'Credential'.

那么有什么意义Get-Credential呢?我在互联网上看到很多例子,他们都以这种方式使用它。

编辑示例:为什么使用此代码-Credential?因为-Credential在函数内部?

function Pause ($Message="Press any key to continue..."){ 
    "" 
    Write-Host $Message 
    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
} 

function GetCompName{ 
    $SQLServer = Read-Host "Please enter a computer name or IP" 
    CheckHost 
} 

function CheckHost{ 
    $ping = gwmi Win32_PingStatus -filter "Address='$SQLServer'" 
    if($ping.StatusCode -eq 0){$pcip=$ping.ProtocolAddress; GetCollation} 
    else{Pause "Host $SQLServer down...Press any key to continue"; GetCompName} 
} 


function GetCollation {
    #Provide Database Name 
    $DatabaseName ="master"
    #Prompt for user credentials 
    $credential = Get-Credential

    $Query = "SELECT name, collation_name FROM sys.databases;  " 

    invoke-sqlcmd -ServerInstance $SQLServer -Database $DatabaseName -Credential $credential  -Query $Query | Format-Table

}
#---------Start Main-------------- 
$SQLServer = $args[0] 
if($SQLServer){CheckHost} 
else{GetCompName}
4

1 回答 1

13

问题可能是由于 Microsoft 有两个版本Invoke-Sqlcmd

  1. 数据库引擎- -Credentials参数。
  2. SqlServer 模块--Credentials参数可用

查看了您最近的几个 SO 问题 - 看起来您拥有cmdlet的数据库引擎版本。SqlServer 模块默认没有安装,所以你必须手动安装。(上一个超链接中有一个“注释”部分解释了这个问题背后的一些历史

简而言之,运行以下命令来获取SqlServer 模块

Install-Module -Name SqlServer -AllowClobber

确保包括-AllowClobber开关。这是一个愚蠢的安装程序,如果您关闭开关,它将下载〜24MB的包,然后失败,因为它覆盖了数据库引擎版本。

于 2018-07-31T23:22:40.580 回答