-2

请为此提出前进的方向,同样我必须为 enddate、用户名等示例:

$StartDate, $String = "", ""

$StartDate = Read-Host -Prompt 'Enter the start date of the logs, Ex: 17/07/2017 09:00:00 '

if ($StartDate -and ( $StartDate -ne " ") -and ($StartDate -ne "")) {
    $StartDate = $StartDate -replace "`t|`n|`r", ""
    $String += " -After '$StartDate'"
} else {
    'You did not enter a valid Start date!'
}
echo "Get-EventLog -LogName Application $String"

Get-EventLog -LogName Application $String

输出:

Get-EventLog -LogName 应用程序-在 '19/07/2017' 之后
Get-EventLog:无法绑定参数“InstanceId”。无法转换价值
“-After '19/07/2017'”输入“System.Int64”。错误:“输入字符串不是
以正确的格式。”
在 C:\Users\kumars2\Downloads\Santosh\Powershell 脚本\Enhancements\查看日志示例\small_test.ps1:17 char:13
+ 获取事件日志 <<<< -LogName 应用程序 $String
    + CategoryInfo : InvalidArgument: (:) [Get-EventLog], ParameterBindingException
    + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetEventLogCommand
4

2 回答 2

4

如果要为 cmdlet 构建参数列表,则应使用splatting而不是构建(部分)字符串命令行。您收到了您观察到的错误,因为 PowerShell 将整个字符串" -After '$StartDate'"作为参数传递给 parameter -InstanceId。此外,您的日期字符串的格式为dd/MM/yyyy. PowerShell 无法自动将此字符串转换为DateTime值,因此您需要自己执行此操作。

$culture = [Globalization.CultureInfo]::InvariantCulture
$pattern = 'dd\/MM\/yyyy'

$StartDate = $StartDate -replace '\s'  # remove all whitespace from date string
$EndDate   = $EndDate -replace '\s'    # remove all whitespace from date string

$params = @{
    'LogName' = 'Application'
}

if ($StartDate) {
    $params['After'] = [DateTime]::ParseExact($StartDate, $pattern, $culture)
}
if ($EndDate) {
    $params['Before'] = [DateTime]::ParseExact($EndDate, $pattern, $culture)
}

Get-EventLog @params
于 2017-07-19T15:21:53.783 回答
1

我不是 100% 确定你在做什么,一些代码在那里弹跳,但假设日期有效,这没有问题:

$After = read-host
Get-EventLog -LogName Application -After $After

您可以像这样验证您的输入:

$After = read-host
if ($After -as [DateTime]) {
Get-EventLog -LogName Application -After $After
} else {
    Write-Host "Your input is not a valid date"
}
于 2017-07-19T15:11:00.487 回答