2014-02-13 4 views
1

Я создаю скрипт для захвата информации с нескольких SQL-серверов, загружая ее в файл, к которому пользователи могут добраться, и не нужно называть меня все время. проблема, с которой я столкнулся сейчас, - это форматирование вывода команды invoke-sql, чтобы я мог поместить ее в хэш-таблицу. Я хочу получить версию SQL в одном столбце (то есть Microsoft SQL Server 2008), а во втором столбце - номер сборки (т. Е. 10.0.5512.0). Ниже следует код, который я создал и что он выводит. Как вы можете видеть, я получаю информацию, но не могу поместить ее в хэш-таблицу. Он просто кладет ... в стол.Форматирование Powershell Invoke-sqlcmd

$SQLVerPart1= Invoke-Sqlcmd -Query "select @@VERSION;" -ServerInstance $Server | Out-String | ForEach-Object { $_ -replace '-.*'} 

$SQLVerPart2 = Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $Server | Out-String 

$SQLVerPart1 | Out-File -Append $Log 
$SQLVerPart2 | Out-File -Append $Log 
$SQLVer.add($SQLVerPart1,$SQLVerPart2) 

ВЫВОД:

Column1

Microsoft SQL Server 2008 (SP3)

Column1


10.0.5512.0

Название Значение

---- ----- ... ...

ответ

0

Вы хотите, чтобы избежать слишком быстрого преобразования в строки. Out-String в назначениях переменных включает заголовок Column1 для каждого объекта. Получите необработанные свойства:

$SQLVerPart1 = (Invoke-Sqlcmd -Query "select @@VERSION" -ServerInstance $Server).Column1 -replace "\n", "" -replace '-.*' 
$SQLVerPart2 = (Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $Server).Column1 

Что касается хеш-таблицы, вы уверены, что это то, что вы хотите? Если у вас есть два экземпляра «Microsoft SQL Server 2008 (SP3)», второй «Добавить» завершится с ошибкой. Возможно, вам нужен массив объектов. Что-то вроде:

$SQLVer = $ListOfServers | ForEach-Object { 
    $SQLVerPart1 = (Invoke-Sqlcmd -Query "select @@VERSION" -ServerInstance $_).Column1 -replace "\n", "" -replace '-.*' 
    $SQLVerPart2 = (Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $_).Column1 

    New-Object -Type PSObject -Property @{ Version = $SqlVerPart1; BuildNumber = SqlVerPart2 } 
} 

Тогда вы можете не беспокоиться о его регистрации или выдачи его после того, как вы собрали данные:

$SQLVer | Out-String 
+0

Это именно то, что мне нужно. Вторая часть работает прелесть, но у меня проблемы с ее расшифровкой.Что касается хеш-таблицы, я просто просматриваю каждый из моих серверов и отбрасываю информацию о версии в начале, прежде чем я займусь другими вещами, такими как базы данных, размеры, владельцы и т. Д., Поэтому я думаю, что первая часть, которую вы дали я сделаю все отлично. Спасибо за быстрый ответ! –

0

я сделать что-то подобное ... с моим сценарием. Это не даст вам 100% пути, но это поможет вам двигаться в нужном направлении.

Для моего сценария аудита сервера SQL, я бегу эти четыре команды:

$ProductVersion = Invoke-Sqlcmd2 -Query "SELECT SERVERPROPERTY('productversion')" -ServerInstance $InstanceName 
$ProductEdition = Invoke-Sqlcmd2 -Query "SELECT SERVERPROPERTY('edition')" -ServerInstance $InstanceName 
$CurrentTime = Invoke-Sqlcmd2 -Query "SELECT GETDATE()" -ServerInstance $InstanceName 
$UserName = Invoke-Sqlcmd2 -Query "SELECT SUSER_SNAME()" -ServerInstance $InstanceName 

Позже я создать хэш-таблицу, например, так:

$hashPropsFormalities = @{ 
    "Instance Name" = $InstanceName 
    "Product Version" = $ProductVersion[0] 
    "Product Edition" = $ProductEdition[0] 
    "User Name" = $UserName[0] 
    "Current Time" = $CurrentTime[0] 
} 

И затем распечатать таблицу хэша в консоль:

$hashPropsFormalities | FT -HideTableHeaders 

Для того, чтобы получить копию вывода консоли в текстовом файле, я использую Start-Transcript (и его коллега, Stop-Transcript).

+0

Спасибо. Я буду висеть на этом коде для будущего ref. Оба являются отличными ответами. –

Смежные вопросы