自定义日志文件创建 - Powershell

时间:2014-04-04 09:11:34

标签: powershell logging

我对脚本有以下要求:

一个。获取脚本名称和路径。 湾创建ScriptPath \ Log-Time | date \ Logfile.Log C。为用户提供3个选项,具体取决于输入更新日志文件。

对于上述要求,我创建了以下脚本:

#Variables Declaration-------------------------------------------
$pat = Split-Path $script:MyInvocation.MyCommand.Path -parent
$LogTime = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"
$a = "[Info]:"+$LogTime+" Logged into Server"
$b = "[Warning]:"+$LogTime+" Unauthorized Access"
$c = "[Error]:"+$LogTime+" Wrong Credentials"
$ScriptName = $MyInvocation.MyCommand.Name
$path = $pat

#Folder and Log Creation------------------------------------------
if([IO.Directory]::Exists($path))
{
$m = New-Item -ItemType directory -Path $path -name Log
$n = New-Item -ItemType directory -Path $m -name $LogTime
}

$LogName = $ScriptName+"_Log_"+$LogTime+".log"
$log = New-Item -ItemType file -path $n -name $LogName

# Log Function------------------------------------------------------
log($in)
function log 
{
$in = Read-Host "Enter your Option"

if ($in -eq "0") 
{
    $latest = Get-ChildItem -Path $n | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    $p = $path+$latest.name
    Add-Content $p  -value $a 
}
elseif ($in -eq "1") 
{

    $latest = Get-ChildItem -Path $n | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    $p = $path+$latest.name
    Add-Content $p  -value $b 

}
elseif ($in -eq "2") 
{

    $latest = Get-ChildItem -Path $n | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    $p = $path+$latest.name
    Add-Content $p  -value $c 

}
else
{
    $o = "Invalid Input"
    $o
}

Move-Item $p $n
}

每当我运行这个时,我都会创建两个日志文件。

Exec2.ps1_Log_04-04-2014_10-21-11.log&&&& MExec2.ps1_Log_04-04-2014_10-21-11.log [M是运行脚本的文件夹]

并且第一个日志文件为空,而第二个日志文件包含文本。

有人可以帮我解决这个问题吗?如果可能的话,让脚本变得简短而又甜蜜?

谢谢和问候, 凯因

1 个答案:

答案 0 :(得分:0)

你的一些代码似乎是多余的,所以我删除了一些代码。比如定义$pat然后将其复制到$path中,所以我只定义了$path一次。我摆脱了$a$b$c,因为您可以直接轻松输入值。

然后我摆脱了整个日志文件夹中的最新文件,并将内容添加到之前定义的日志文件中。我更改了日志条目,因此它们是由标签完成的,因此当您查看日志文件时,条目类型,日期和实际条目都很好地排列。

最后,我将整个If> ElseIf> ElseIf的内容更改为Switch,因为Switch非常棒且完全未被充分利用!哦是的,我摆脱了$o = "Invalid Input"; $o因为定义一个变量然后只是回显它是没有意义的。您可以做的是在default部分让它写入托管错误并再次调用日志功能,因此人们被迫输入有效条目。

#Variables Declaration-------------------------------------------
$path = Split-Path $script:MyInvocation.MyCommand.Path -parent
$LogTime = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"
$ScriptName = $MyInvocation.MyCommand.Name

#Folder and Log Creation------------------------------------------
$m = New-Item -ItemType directory -Path $path -name Log
$n = New-Item -ItemType directory -Path $m -name $LogTime

$LogName = $ScriptName+"_Log_"+$LogTime+".log"
$log = New-Item -ItemType file -path $n -name $LogName

# Log Function------------------------------------------------------
log
function log{
    $in = Read-Host "Enter your Option (0,1,2)"

    Switch ($in){
        0 {Add-Content $log  -value ("[Info]:`t`t" + $LogTime + "`tLogged into Server")}
        1 {Add-Content $log  -value ("[Warning]:`t" + $LogTime + "`tUnauthorized Access")}
        2 {Add-Content $log  -value ("[Error]:`t" + $LogTime + "`tWrong Credentials")}
        default {Write-Output "Invalid Input"}
    }
}