Questions tagged «powershell»

Windows PowerShell™是一种基于任务的命令行外壳和脚本语言,专门用于Windows任务的自动化。使用此标签的问题应将自己限制为直接与数据库层进行交互。一般的Powershell脚本问题应直接针对[StackOverflow](/programming/tagged/powershell)

3
我应该使用哪种PowerShell技术与SQL Server通讯?
我最终希望使用PowerShell替换用于SQL实例监视器的旧KornShell脚本。但是,我很难过,无法理解PowerShell可以与SQL Server实际进行通信的所有不同方式。不确定是否全部都是这些,但是这里有5种完全不同的方式可以查询SQL Server的版本: 1. SQLConnection .NET类 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=MyServer;Database=Master;Integrated Security=True" $SqlCmd = New-Object System.Data.SqlClient.SqlCommand $SqlCmd.CommandText = "Select @@version as SQLServerVersion" $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $SqlConnection.Close() $DataSet.Tables[0] 2. WMI提供者 $sqlProperties = Get-WmiObject -computerName "MyServer" -namespace root\Microsoft\SqlServer\ComputerManagement10 …

6
使用PowerShell发现所有正在运行的SQL Server实例的最有效方法是什么?
我的任务是发现我们域中运行的所有SQL Server实例。在某些情况下,每个服务器有多个实例。我已经看到了找到这些实例的两种不同的PowerShell方法,但是似乎都找不到所有实例。 1)使用WMI $srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName $instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}} return $instances 2)使用远程注册表(与Get-SQLInstance 1一样) 我遇到的最大问题是,并不是我所知道的所有服务器都与SQL Server WMI提供程序一起运行,也不是它们都允许远程注册表。有第三种方法吗?我可以使用远程桌面访问所有服务器,但是我正在寻找大约30台计算机,如果可能的话,我希望避免手动操作。这仅适用于SQL Server 2008及更高版本,虽然很高兴了解其他SQL Server服务(SSIS / SSAS / SSRS),但我的主要重点是SQL Server本身。

2
SQL Agent Powershell上下文参考
在我的新工作中,每个服务器上都有多个命名实例。例如 Server1 \ Dev Server1 \ DevIntegrated 服务器1 \质量检查 我的作品中有一个SQL PowerShell脚本,可以调用OS,调用它,Foo.exe但需要传递命令行参数(连接字符串)。每个实例上都将存在一个SQL Agent作业,其步骤为PowerShell类型,该步骤需要知道当前上下文是什么。即此执行从DevIntegrated开始。 我不希望每个脚本都以...开头 $thisInstance = "Dev" ...特别是因为在接下来的几个月中,当我们迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。 如果启动SQLPS,则可以通过将Get-Location的结果切片和切块或运行来确定实例 (Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName 当SQL Agent启动PowerShell类型的作业时,它将在C:\ windows \ system32中启动,并且该Get-Location路由不起作用,因为它不在SQLSERVER上下文中。我可以更改为该上下文,但是我将位于SQL Server的“根目录”,并且不知道我应该在哪个实例中使用。Invoke-Sqlcmd由于相同的原因,使用路由也不起作用(从技术上讲,它在那里超时了)不是默认实例) 据我所知,我已经列举了所有可以进入工作日志的基本“内容”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated Get-ChildItem Get-Host Get-Location Get-Process Get-PSDrive Get-PSProvider Get-Service Get-TraceSource Get-Variable Get-Process似乎我可以使用它以及通过敲击实例和匹配spid来拼凑事物的一些巫术,但这听起来像是来自地狱的血腥骇客。我必须缺少一些基本的东西,有人可以阐明吗? 研究了PowerShell的替代方法 我调查了其他工作类型,但没有得到满意的解决方案。研究表明,SQL代理下列出的PowerShell为SQLPS,并通过右键单击该代理来启动它的实例,从而自动将我放到正确的位置。如前所述,只有当我将交互式代码粘贴到工作步骤中时,我才知道其中的区别。 作业类型的OS使我进入了相同的状态,因为我无法找到确定哪个实例将我放入命令外壳的方法。当然,我可以sqlcmd并获取的值,@@servername但是如果我知道启动sqlcmd的连接,则无需查询数据库;) 如果启用了TSQL,TSQL可能会起作用,xp_cmdshell但是我不确定它们是否已启用---政府工具,并且在使用非默认设置时可能会感到困惑。即便如此,我仍然沉迷于动态SQL,并失去了PowerShell提供的许多表达能力。 虽然有点麻烦,但我认为第一步要定义一个变量,然后将其传递给后续步骤,但是研究发现这篇文章处理多个作业步骤(BOL) 作业步骤必须是独立的。也就是说,作业无法在作业步骤之间传递布尔值,数据或数字值。但是,您可以使用永久表或全局临时表将值从一个Transact-SQL作业步骤传递到另一步骤。您可以使用文件将运行可执行程序的作业步骤中的值从一个作业步骤传递到另一作业步骤。 我不能使用常见的技巧,例如Foo.exe寻找众所周知的文件/环境变量/注册表设置,因为那样会阻止跨实例的并发执行。 …

1
在Powershell中从SSMS检索打印的消息
我们的DBA团队不会使用以下方法来验证备份TSQL(可以轻松地在备份后完成备份,几乎不需要时间,因此我不知道为什么不这样做): RESTORE VERIFYONLY FROM DISK = 'D:\Backups\LOCATION' 他们过去曾遇到过问题,因此即使我们认为他们会从中学到东西,也没有。我创建了一个Powershell脚本来执行此操作,因为我们有大约100多个服务器,我只想针对所有备份运行此脚本,以确保它们有效。下面的脚本可以正确运行(因为它不会中断或抛出错误),我很好奇是否有一种方法可以将返回的消息返回到Powershell中,而我们通常会在SSMS中得到该消息,其中指出文件1上的备份集为作为验证有效。 $SqlCon = New-Object System.Data.SqlClient.SqlConnection $SqlCon.ConnectionString = "SERVER=SERV\INST;Integrated Security=true;DATABASE=master" $baks = Get-ChildItem "D:\Backups\" -Filter *.BAK foreach ($bak in $baks) { $SqlCon.Open() $cd = New-Object System.Data.SqlClient.SqlCommand $cd.Connection = $SqlCon $cd.CommandText = "RESTORE VERIFYONLY FROM DISK = @f" $cd.Parameters.Add("@f", $bak.FullName) $cd.ExecuteNonQuery() $SqlCon.Close() }

4
从正在执行的作业中获取作业ID或作业名称
我有一个中央数据库,可以在所有服务器上写入工作结果。我通过SQL作业中的powershell将3个参数传递回中央服务器上的sp,以验证该作业应在当时运行,等等。然后通过SSRS公开该信息,因此我们可以看到作业失败/长时间运行的作业/ &尚未运行但应该运行的作业(或者如果有人弄乱了时间表)。 为此,我将2个作业步骤添加到每台服务器上的每个作业中,并且我希望将脚本减少到仅添加到每个作业中的1个步骤。甚至可能从网络共享中调用该脚本。 但是我的问题是我传递的三个参数之一。我需要从正在执行的作业中获取正在执行的作业ID或作业名称,因此不必硬编码name参数。我传递的3个参数是Jobid,状态(成功/失败)和errormsg。我编写的powershell脚本非常简单。 调用sqlcmd -ServerInstance“ MYRemoteSYSTEM”-数据库remoteDB-查询“ exec dbo.JOB_LOG'JOBNAME / ID','成功/失败','错误消息在这里''' 这将我需要的东西写到桌子上。我已经看过msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs /,但是这些都不保证在执行多个作业的情况下,我可以获得正确执行作业的ID或名称。同时。 我什至尝试查看sys.sysprocesses,但我认为由于代理作业是一个powershell脚本,因此它显示为“ .Net SqlClient数据提供程序”,因此我无法从显示为“ SQLAgent-”的作业中删除二进制JOBID。 TSQL JobStep(作业0xF1800243164745429C30474FFD5C990C:第1步)” ---我从Denny Cherry的帖子中学到的 -谢谢denny- 任何关于如何获取执行中的Jobid的想法将不胜感激。 谢谢, 克里斯

1
确定导致数据库卡在RESTORING状态的根本原因
我知道有一些问题可以解决数据库卡在RESTORING状态中的问题,并使用这些解决方案手动将数据库恢复在线状态,但是我的情况有所不同。 我使用Powershell脚本进行了自动还原,该脚本将生产的副本还原到DEV实例。这些脚本在大约一年内没有发生变化,并且偶尔会完成还原过程,但是还原后的数据库仍处于RESTORING状态(有时脚本可以正常工作,有时会失败)。 每当我手动重新运行该过程时,或者从SSMS的用户界面或通过T-SQL手动还原数据库时,它都会毫无问题地完成。 我找到了建议CHECKDB在还原后的数据库上运行的答案,但没有任何结果导致此问题。 由于还原脚本还原了数据库的完整备份并使用了一个"WITH RECOVERY"选项,因此我试图找出可能停止还原过程的原因,尽管实际上是使用进行还原的"WITH RECOVERY"。 真的很感谢任何建议,因为我一直努力了解为什么会不时发生这种情况。 我非常想解决问题的根本原因,而不是解决症状,那就是再次手动还原数据库。 更新: Github Gist如@Brent建议- 在此处。

1
在PowerShell中通过SQLCMD连接到LocalDB
我正在尝试使用SQLCMD实用程序通过PowerShell访问计算机上的“ localdb \ MSSQLLocalDB”服务器。我正在使用PowerShell v5,.NET v5.0,并且服务器名称是(localdb)\MSSQLLocalDB在Microsoft SQL Server Management Studio 2014中连接到服务器时的名称。 PS C:\> sqlcmd -S localdb\MSSQLLocalDB并PS C:\> sqlcmd -S .\localdb\MSSQLLocalDB导致此错误: Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序11:SQL Server网络接口:查找指定的[xFFFFFFFF]服务器/实例时出错。 我在Management Studio中查询了服务器名称,SELECT @@ServerName并-S在上述命令中使用了该名称,并得到了相同的错误。 PS C:\> sqlcmd -S localdb 给出此错误: Sqlcmd:错误:SQL Server的Microsoft ODBC驱动程序11:命名管道提供程序:无法打开与SQL Server的连接[53] 其他说明:我可以使用以下连接字符串连接到服务器并在C#控制台应用程序中使用名为testdb01的数据库进行工作System.Data.SqlClient: "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=testdb01;Integrated Security=SSPI;"

2
SQL Agent-PowerShell步骤“语法错误”
我在SQL Agent Job步骤中未运行的以下代码设置。收到的消息很简单: 无法开始执行步骤1(原因:第46行:语法错误)。该步骤失败。 工作时间为: 00:00:00 该脚本的第46行是here-string: ,@DriveLetter = '$($c.DriveLetter)' 该脚本可以在SQL Server代理之外完美运行。 ServerNames表: CREATE TABLE ServerTable ( ServerName varchar(50) ) 磁盘空间表将类似于: CREATE TABLE DiskSpace ( ID int IDENTITY(1,1), ServerName varchar(50), DriveLetter varchar(2), DiskSpaceCapacityGB decimal(12,5), DiskSpaceFreeGB decimal(12,5) ) PowerShell脚本: This command is to allow SQL Agent job to show failure in …

2
在SQL Server代理中运行Powershell脚本时出错
我有一个通过SQL Server代理运行的SQL作业(正在运行SQL Server 2012 Enterprise)。作业的最后一步是运行位于网络共享上的应用程序。不幸的是,我不知道应用程序所在的文件夹的名称(该文件夹是版本号),因此我正在使用PowerShell查找它: set-location "\\server\companydocuments\MyApp\Application Files\" $name = Get-ChildItem | sort name -desc | select -f 1 | select name cd $name.name & ".\Application.exe" 如果我在SQL Server上打开PowerShell窗口,则可以正常工作。当我在SQL Server代理中运行此命令时,出现以下错误: A job step received an error at line 1 in a PowerShell script. The corresponding line is 'set-location "\\server\companydocuments\MyApp\Application Files\'" 我以为这可能是权限问题,所以我尝试在我的凭据(这是测试服务器,不是生产服务器)下运行SQL …

2
是否有可以帮助SQL Server维护任务的PowerShell脚本集合?
我一直在研究PowerShell,并且一直(慢慢地)将其纳入我的日常DBA任务中。 到目前为止,我已经看到了许多用于许多不同管理活动的断开连接的PowerShell脚本。 我想知道的是,是否存在人们通常要去的官方(或可识别的)PowerShell脚本集合或存储库,以获取用于常见DBA活动的SQL Server PowerShell脚本(例如Ola Hallengren的T-SQL脚本)。

2
powershell获取sql服务器内存计数器并显示值
我正在编写一个powershell脚本来捕获以下SQL Server计数器: SQL Server:内存管理器:服务器总内存(KB) SQL Server:内存管理器:目标服务器内存(KB) 我的机器有3个SQL Server实例,所以我希望此脚本动态捕获所有计数器并仅报告1个样本的值。我试着写以下内容: Get-counter -List *SQL*Memory* | Select paths, counter | format-list # doesn't display full list Get-counter -List *SQL*Memory* | Select paths, counter | where {_.counter -like "*server memory*"} |format-list # displays nothing 最终,我想使用-computername参数跨多个服务器运行它,因此我希望它可以动态捕获。 谁能帮我找到缺失的东西吗?以下是我正在运行的确切脚本: Function checkTransactionsPerSecond([string] $Hostname ) { (Get-Counter -ListSet "*Databases").Counter | …

1
为一个文件夹中的多个.DTSX软件包文件确定PackageFormatVersion
肯尼斯·费舍尔(Kenneth Fisher)发表了一篇博客文章,介绍如何确定我的SSIS包是什么SQL版本?在2015年4月。 它具有一个表,该表将哪个SQL版本映射到PackageFormatVersionXML元数据中找到的哪个SSIS包。在查看1个单个包装时,此功能很有用。 我有一个大约100个SSIS .DTSX软件包的文件夹,我需要知道它们都是哪个SQL版本。 如何批量确定文件夹(文件系统)中PackageFormatVersion多个.DTSX软件包的版本(即SQL版本)? 最终目标是确定要获取并实施以将这些软件包放入其中的正确的TFS版本,因为当前不存在任何源代码控制系统。肯尼斯提出的表格将帮助我回答这个问题,但是首先我需要确认软件包的SQL版本是什么。 假设我没有安装BIDS或SSDT。 假设所需的输出是这样的,其中管道指定一个新列: PackageFilename | PackageFormatVersion -------------------------------------- Package1.dtsx | 3 Package2.dtsx | 4 欢迎使用PowerShell,TSQL,可以抓取目录结构的第三方工具或其他工具。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.