【问题标题】:Why the argument is empty or null为什么参数为空或 null
【发布时间】:2021-01-20 21:09:27
【问题描述】:

每个人 我是 Powershell 的新手。 我的脚本收集 Windows 事件查看器日志并将数据导出到 csv 文件。如果输入为空,则使用默认值。 但它崩溃了: “Export-Csv:无法验证“路径”参数的参数。参数为空或 NULL。指定一个非空、非空参数,然后再次运行该命令。 能解释一下为什么吗?

function exportLogs
{
    [CmdletBinding()]
    param (
        $exportFolder=(Read-Host -prompt "exportFolder"),
        $applicatiomLogs=(Read-Host -prompt "applicationLogs"),
        $systemLogs=(Read-Host -prompt "systemLogs"),
        $fromDate=(Read-Host -prompt "fromDate"),
        $eventTypes=(Read-Host -prompt "eventTypes")
    )

    $comp = $env:computername
    $now=Get-Date

    #check empty input and assign default values
    if (!$exportFolder) { [String]$exportFolder="D:\temp\" }
    if (!$applicationLogs) {
        $applicationLogs="True"
        [System.Convert]::ToBoolean($applicationLogs)    
    }
    if (!$systemLogs) {
        $systemLogs="True"
        [System.Convert]::ToBoolean($systemLogs)
    }
    if (!$fromDate) { [DateTime]$fromDate=$now.AddDays(-30) }
    if (!$eventtypes) { [String[]]$eventtypes=("Error", "Warning") }

    if ($applicationLogs)
    {
        $exportFile = $exportFolder + "applicationLogs_" + $now.ToString("yyyyMMddHHmmss") + ".csv"
        $exportedLog = get-eventlog -ComputerName $comp -log "Application" -After $fromDate -EntryType $eventTypes
        exportCsv($exportedLog, $exportFile)
    }

    if ($systemLogs)
    {
        $exportFile = $exportFolder + "systemLogs_" + $now.ToString("yyyyMMddHHmmss") + ".csv"
        $exportedLog = get-eventlog -ComputerName $comp -log "System" -After $fromDate -EntryType $eventTypes
        exportCsv($exportedLog, $exportFile)
    }
   
}

function exportCsv([String]$exportedLog, [String]$exportFile)
    {
        $el_sorted = $exportedLog | Sort-Object TimeGenerated
        Write-Host Exporting to $exportFile
        $el_sorted|Select MachineName, TimeGenerated, EntryType, Source, Message | Export-CSV $exportFile -NoTypeInfo
    }

【问题讨论】:

  • 函数使用语法FunctionName -Parameter1 Value1 -Parameter2 Value2调用。他们不使用方法语法functionName(param1,param2)。试试exportCsv $exportedLog $exportFile
  • 有些不一致的函数调用语法在开始时可能会令人困惑。原生 PowerShell 函数(通常称为 cmdlet)被称为 @AdminOfThings 所写的,参数周围没有括号。相反,当调用“低级”.NET 函数(如Date.AddDays)时,您必须将参数括在括号中。作为一种快捷方式,您可以记住仅在使用点“。”调用函数时才使用后者。或双冒号“::”语法。
  • 您的函数命名无效,即 exportCsv。请参阅 PS 文档。做法是动词-名词New-LogExport,例如。切勿在命名中使用保留字、名称、默认 PowerShell 对象,即 exportCsv 与 Export-Csv 过于接近。如果你这样做,你只会给自己带来不必要的问题。函数必须在调用之前加载。 exportCsv 位于末尾,需要在 to 或至少在任何调用它之前

标签: windows powershell


【解决方案1】:

试试这个重构...(在 Win10 上的默认 Windows 沙盒上运行)

function New-LogExport
{
    Param
    (
        [String]$exportedLog, 
        [String]$exportFile
    )

    $el_sorted = $exportedLog | 
    Sort-Object TimeGenerated
    Write-Host "Exporting to $exportFile"
    
    $el_sorted | 
    Select-Object MachineName, 
    TimeGenerated, 
    EntryType, 
    Source, 
    Message | 
    Export-Csv -Path $exportFile -NoTypeInfo
}

function Start-ExportLogs
{
    [CmdletBinding()]
    param 
    (
        $exportFolder    = (Read-Host -prompt 'exportFolder'),
        $applicatiomLogs = (Read-Host -prompt 'applicationLogs'),
        $systemLogs      = (Read-Host -prompt 'systemLogs'),
        $fromDate        = (Read-Host -prompt 'fromDate'),
        $eventTypes      = (Read-Host -prompt 'eventTypes')
    )

    $comp = $env:computername
    $now  = Get-Date

    if (!$exportFolder) 
    {[String]$exportFolder = 'C:\temp'}

    if (!$applicationLogs) 
    {
        $applicationLogs = 'True'
        [System.Convert]::ToBoolean($applicationLogs)    
    }

    if (!$systemLogs)
    {
        $systemLogs = 'True'
        [System.Convert]::ToBoolean($systemLogs)
    }

    if (!$fromDate)
    {[DateTime]$fromDate = $now.AddDays(-30)}

    if (!$eventtypes)
    {[String[]]$eventtypes = ('Error', 'Warning')}

    if ($applicationLogs)
    {
        $exportFile = "$exportFolder\applicationLogs_$($now.ToString('yyyyMMddHHmmss')).csv"

        $getEventLogSplat = @{
            ComputerName  = $comp
            LogName       = 'Application'
            EntryType     = $eventTypes
            After         = $fromDate
        }
        $exportedLog      = Get-EventLog @getEventLogSplat
        New-LogExport -exportedLog $exportedLog, -exportFile $exportFile
    }

    if ($systemLogs)
    {
        $exportFile = "$exportFolder\systemLogs_$($now.ToString('yyyyMMddHHmmss')).csv"

        $getEventLogSplat = @{
            ComputerName  = $comp
            LogName       = 'System'
            EntryType     = $eventTypes
            After         = $fromDate
        }
        $exportedLog      = Get-EventLog @getEventLogSplat
    }
    New-LogExport -exportedLog $exportedLog -exportFile $exportFile
}

# Results
<#
exportFolder: 
applicationLogs: 
systemLogs: 
fromDate: 
eventTypes: 
True
True
Exporting to C:\temp\applicationLogs_20210120143659.csv
Exporting to C:\temp\systemLogs_20210120143659.csv
#>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2023-02-17
    • 2017-11-14
    • 2021-07-24
    • 1970-01-01
    • 2021-09-15
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多