【问题标题】:read userinput and pass to Get-EventLog function读取用户输入并传递给 Get-Event Log 函数
【发布时间】:2017-12-24 22:52:25
【问题描述】:

请为此建议前进的方向,同样我必须为结束日期、用户名等做。 示例:

$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 + 获取事件日志

【问题讨论】:

  • 请尝试多花点时间写一个实际的问题。 “请为此提出前进的方向,同样......”根本不清楚,而且很难弄清楚你实际上在问什么。

标签: powershell get-eventlog


【解决方案1】:

如果您想为 cmdlet 构建参数列表,您应该使用 splatting 而不是构建(部分)字符串命令行。您收到了您观察到的错误,因为 PowerShell 将整个字符串 " -After '$StartDate'" 作为参数传递给参数 -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

【讨论】:

  • 谢谢它的工作.. 你能建议增强脚本以仅在用户给出值的情况下采用值,例如:用户只给 StartDate 输入(在 dd/MM/yyyy 或 /dd/MM /yyyy HH:MM:SS) 而不是 EndDate,如何在参数中跳过这个
  • 非常感谢..它现在与日期 I 一起工作。我需要日期或日期时间
  • @San 相应地调整pattern。如果您期待一个交钥匙解决方案:那是不会发生的。
  • 好的,我将更改日期模式,你能建议如何传递 $Message 如下例:Get-EventLog -LogName Application -After '18/07/ 2017 年 - 在 '20/07/2017' 之前 - 消息“* 配置 *”
  • 请停止移动目标。重新阅读我的答案,很明显您需要为$params 哈希表添加另一个参数。
【解决方案2】:

我不能 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"
}

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    相关资源
    最近更新 更多