2015-08-19 4 views
2

Мой скрипт поддерживает несколько баз данных SQL Server, и у меня есть вывод каждой базы данных и имени файла в файл журнала. Я не уверен, как выровнять их в формате столбцов.Формат журнала Выход

Function LogWrite 
{ 
    Param ([string]$logstring) 
    Add-content $Logfile -value $logstring 
} 


$server = new-object ("Microsoft.SQLServer.Management.Smo.Server") "(Local)\sqlexpress" 
$databases = $server.databases 

$array = @($db1,$db2,$db3,$db4,$db5,$db6,$db7,$db8,$db9,$db10,$db11) 
foreach ($element in $array) 
{ 
    foreach ($db in $databases) 
    { 
    if($db.Name -like $element) 
    { 
     $dbname = $db.Name 
     $dateTime = get-date -format yyyy_MM_dd 
     $fullBackupFilePath = ($backupDirectory + "\" + $dbname + "_FULL_" + $dateTime + ".bak") 

     Backup-SQLDatabase -ServerInstance $sqlServer -Database $dbname -BackupFile $fullBackupFilePath 

     LogWrite "$dbname - $backupDirectory" 
    } 
    } 
} 

Это то, что она в настоящее время выглядит следующим образом:

Databases Succesfully Backed Up: 

Aqm  C:\Mappa_Backup\FULL 
Atlas  C:\Mappa_Backup\FULL 
halive  C:\Mappa_Backup\FULL 
hatrafficinfo  C:\Mappa_Backup\FULL 
jtr  C:\Mappa_Backup\FULL 
jtr2  C:\Mappa_Backup\FULL 
mappa  C:\Mappa_Backup\FULL 
mtf  C:\Mappa_Backup\FULL 
PartOneClaims  C:\Mappa_Backup\FULL 
ptfeedback  C:\Mappa_Backup\FULL 


The following files were deleted as they were older than 14 days: 

Aqm_FULL_2015_08_19.bak 
Atlas_FULL_2015_08_19.bak 
halive_FULL_2015_08_19.bak 
hatrafficinfo_FULL_2015_08_19.bak 
jtr2_FULL_2015_08_19.bak 
jtr_FULL_2015_08_19.bak 
mappa_FULL_2015_08_19.bak 
mtf_FULL_2015_08_19.bak 
PartOneClaims_FULL_2015_08_19.bak 
ptfeedback_FULL_2015_08_19.bak 

ответ

3

Другой простой вариант заключается в использовании директивы .NET форматирования т.д .:

LogWrite ("{0,20} - {1,-60}" -f $dbname,$backupDirectory) 

Где спецификатор формата {<placeholder-number>,[- for left-align]<field-width>}.

+0

это, вероятно, будет тот путь, по которому я пойду сюда. – ssaviers

+0

Я смотрел на это, но сценарий продолжал терпеть неудачу - Твоя с другой была на месте! –

3

Вы можете использовать пользовательские PSObject.

$result = @{ DBName = $dbname; BackupDirectory=$backupDirectory } 
$line = new-object PSObject -Property $result 

$line 
+0

Это мой предпочтительный метод, так как он гарантирует, что все выйдет из объекта, если вам нужно добавить скрипт и что-то нужно сделать со значением вниз по конвейеру (например, записать обратно в таблицу для целей отчетности). –

1

Вы можете использовать хеш-таблицу и показать ее с помощью командлета format-table.

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll' 
$server = new-object ("Microsoft.SQLServer.Management.Smo.Server") "(Local)"  
$databases = $server.databases        

## some variables definitions 
$db1 = "Model" 
$db2 = "TempDb" 
$db3 = "Master" 
$backupDirectory = "c:\Backup\Etc" 
$table = @{} 
## 

$array = @($db1,$db2,$db3,$db4,$db5,$db6,$db7,$db8,$db9,$db10,$db11)    

foreach ($element in $array) 
{ 
foreach ($db in $databases) 
{ 
    if($db.Name -like $element) 
    { 
     $dbname = $db.Name 
     $dateTime = get-date -format yyyy_MM_dd 
     $fullBackupFilePath = ($backupDirectory + "\" + $dbname + "_FULL_" + $dateTime + ".bak") 

     $table.Add(($db),($fullBackupFilePath)) 
    } 
} 
} 

$table | Format-Table 

Результат Результат будет выглядеть так:

enter image description here

1

Вы можете сделать что-то простое с дополнением.

LogWrite "$($dbname.padright(20)) $BackupDirectory" 
0

Существует несколько способов выравнивания текста в PowerShell. Проще всего отделить элементы с закладками

LogWrite "$dbname`t$backupDirectory" 

, который получил бы вам что-то вроде этого:

Aqm  C:\Mappa_Backup\FULL 
Atlas C:\Mappa_Backup\FULL 
halive C:\Mappa_Backup\FULL 
hatrafficinfo C:\Mappa_Backup\FULL 
jtr  C:\Mappa_Backup\FULL 
jtr2 C:\Mappa_Backup\FULL 
mappa C:\Mappa_Backup\FULL 
mtf  C:\Mappa_Backup\FULL 
PartOneClaims C:\Mappa_Backup\FULL 
ptfeedback  C:\Mappa_Backup\FULL 

Это не будет выравнивать столбцы идеально, но лучше, чем раньше, и вы получите файл с разделителями табуляции, который можно легко обрабатывать с помощью других инструментов без необходимости анализировать значения из каждой строки (если требуется дополнительная обработка).


Если вы должны быть выровнены столбцы в файле журнала, вы можете (как @PeterSchneider предложил) создавать пользовательские объекты, которые автоматически отображаются в табличном формате, если они имеют менее 5 свойств:

$prop = [ordered]@{ 
    DBName   = $dbname 
    BackupDirectory = $backupDirectory 
} 
$obj = New-Object -Type PSCustomObject -Property $prop | Out-String 
LogWrite $obj 

, который будет создавать записи журнала, как это:

DBName            BackupDirectory 
------            --------------- 
Aqm             C:\Mappa_Backup\FULL 

DBName            BackupDirectory 
------            --------------- 
Atlas            C:\Mappa_Backup\FULL 

... 

или как это, если вы удалите Out-String:

@{DBName=Aqm; BackupDirectory=C:\Mappa_Backup\FULL} 
@{DBName=Atlas; BackupDirectory=C:\Mappa_Backup\FULL} 
... 

Есть несколько недостатков этого подхода. Во-первых, вы получаете заголовок для каждой строки, записанной в файл, если только вы не эхо из объектов внутри цикла, и ваша функция ведения журнала считывает свой вход из конвейера вне цикла. Это также потребовало бы изменения вашей петли foreach до ForEach-Object.

Function LogWrite { 
    Param ([Parameter(ValueFromPipeline=$true)][string]$logstring) 
    Process { 
    Add-content 'C:\temp\out.txt' -value $logstring 
    } 
} 

... 

$databases | ForEach-Object { 
    ... 

    $prop = [ordered]@{ 
    DBName   = $dbname 
    BackupDirectory = $backupDirectory 
    } 
    New-Object -Type PSCustomObject -Property $prop 
} | Out-String | LogWrite 

Кроме того, ширина столбцов может варьироваться в зависимости от прогона, а значения могут быть усечены в зависимости от их длины. Кроме того, если объекты имеют 5 или более свойств, автоматическое форматирование изменяется в формате списка, поэтому для поддержания вывода таблиц вам потребуется дополнительно Format-Table.


Пожалуй лучший подход для получения выровненных колонок будет использовать format operator (-f), как это было предложено @KeithHill:

LogWrite ('{0,-20} {1,-60}' -f $dbname, $backupDirectory) 

Первое число в каждом наборе фигурных скобках индекс аргумент (0 относится к первому аргументу, здесь $dbname, 1 ко второму и так далее), второе число определяет ширину столбца. Знак минус выравнивает столбец слева. Без него столбцы выравниваются вправо.

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