【发布时间】: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