Powershell 格式化日志输出

Powershell 格式化日志输出,powershell,logging,formatting,Powershell,Logging,Formatting,我的脚本正在备份多个SQL Server数据库,并将每个数据库和文件名输出到日志文件中。我不确定如何在列格式中对齐它们 函数日志写入 { 参数([string]$logstring) 添加内容$Logfile-值$logstring } $server=新对象(“Microsoft.SQLServer.Management.Smo.server”)“(本地)\sqlexpress” $databases=$server.databases $array=@($db1、$db2、$db3、$db4

我的脚本正在备份多个SQL Server数据库,并将每个数据库和文件名输出到日志文件中。我不确定如何在列格式中对齐它们

函数日志写入
{
参数([string]$logstring)
添加内容$Logfile-值$logstring
}
$server=新对象(“Microsoft.SQLServer.Management.Smo.server”)“(本地)\sqlexpress”
$databases=$server.databases
$array=@($db1、$db2、$db3、$db4、$db5、$db6、$db7、$db8、$db9、$db10、$db11)
foreach($数组中的元素)
{
foreach($db,单位为$databases)
{
if($db.Name-like$element)
{
$dbname=$db.Name
$dateTime=获取日期-格式yyyy\U MM\U dd
$fullBackupFilePath=($backupDirectory+“\”+$dbname+“\u FULL\”+$dateTime+“.bak”)
备份SQLDatabase-ServerInstance$sqlServer-Database$dbname-BackupFile$fullBackupFilePath
日志写入“$dbname-$backupDirectory”
}
}
}
这就是它目前的样子:

数据库成功备份:
Aqm C:\Mappa\u备份\FULL
图集C:\Mappa\u备份\FULL
halive C:\Mappa\U备份\FULL
hatrafficinfo C:\Mappa\u备份\FULL
jtr C:\Mappa\u备份\FULL
jtr2 C:\Mappa\u备份\FULL
mappa C:\mappa\U备份\FULL
mtf C:\Mappa\u备份\FULL
PartOne声明C:\Mappa\u备份\FULL
PTC:\Mappa\u备份\FULL
以下文件已被删除,因为它们已超过14天:
Aqm_完整_2015_08_19.bak
Atlas_FULL_2015_08_19.bak
halive_FULL_2015_08_19.bak
hatrafficinfo_FULL_2015_08_19.bak
jtr2_完整_2015_08_19.bak
jtr_FULL_2015_08_19.bak
mappa_FULL_2015_08_19.bak
mtf全部2015年8月19日bak
第1方索赔全部2015年08月19日bak
PTU反馈完整2015 08 19.bak

您可以使用自定义PSObject

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

$line

您可以使用自定义PSObject

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

$line

您可以使用哈希表并使用format-table cmdlet显示它

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 
输出结果如下所示:


您可以使用哈希表并使用format-table cmdlet显示它

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 
输出结果如下所示:


另一个简单的选择是使用.NET格式化指令,例如:

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

其中格式说明符为
{,[-表示左对齐]}

另一个简单的选项是使用.NET格式指令,例如:

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

如果格式说明符是
{,[-表示左对齐]}

您也可以使用填充来完成一些简单的操作

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

你也可以做一些简单的填充

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

在PowerShell中有几种对齐文本的方法。最简单的方法是用制表符分隔元素

LogWrite“$dbname`t$backupDirectory”
这会让你得到这样的东西:

Aqm C:\Mappa\u备份\FULL
图集C:\Mappa\u备份\FULL
halive C:\Mappa\U备份\FULL
hatrafficinfo C:\Mappa\u备份\FULL
jtr C:\Mappa\u备份\FULL
jtr2 C:\Mappa\u备份\FULL
mappa C:\mappa\U备份\FULL
mtf C:\Mappa\u备份\FULL
PartOne声明C:\Mappa\u备份\FULL
PTC:\Mappa\u备份\FULL
这不会使列完全对齐,但比以前更好,而且您可以得到一个以制表符分隔的文件,您可以使用其他工具轻松处理该文件,而无需解析每行中的值(如果需要/需要进一步处理)


如果日志文件中必须有对齐的列,则可以(按照建议)创建自定义对象,只要这些对象的属性少于5个,就会自动以表格格式显示:

$prop=[已订购]@{
DBName=$DBName
BackupDirectory=$BackupDirectory
}
$obj=新对象-类型PSCustomObject-属性$prop | Out字符串
LogWrite$obj
这将创建如下日志条目:

DBName备份目录
------                                              ---------------
Aqm C:\Mappa\u备份\FULL
DBName备份目录
------                                              ---------------
图集C:\Mappa\u备份\FULL
...
或者,如果您删除
输出字符串

@{DBName=Aqm;BackupDirectory=C:\Mappa\u Backup\FULL}
@{DBName=Atlas;BackupDirectory=C:\Mappa\u Backup\FULL}
...
不过,这种方法有几个缺点。首先,写入文件的每一行都有一个头,除非您回显循环内的对象,并让日志函数从循环外的管道读取其输入。这还需要将
foreach
循环更改为
foreach对象

函数日志写入{
Param([Parameter(ValueFromPipeline=$true)][string]$logstring)
过程{
添加内容“C:\temp\out.txt”-值$logstring
}
}
...
$databases | ForEach对象{
...
$prop=[订购]@{
DBName=$DBName
BackupDirectory=$BackupDirectory
}
新对象-类型PSCustomObject-属性$prop
}|输出字符串|日志写入
此外,列宽在运行之间可能会有所不同,值可能会根据其长度而被截断。另外,如果对象具有5个或更多属性,则自动格式将更改为列表格式,因此您需要额外的
格式表
来维护表格输出


可以说,获得对齐列的最佳方法是使用(
-f
),如下所示:

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

每组花括号中的第一个数字是参数的索引(0表示第一个参数,此处
$dbname
,1表示第二个参数,依此类推),第二个数字定义列宽。减号使列向左对齐。没有它,列将向右对齐。

在PowerShell中有几种对齐文本的方法。最简单的方法是用制表符分隔元素

LogWrite“$dbname`t$backupDirectory”
那会给你带来什么