PowerShell,使用函数调用脚本中的开关

问题描述 投票:0回答:1

我正在尝试编写一个简单的日志记录脚本,将待办事项保存到我可以快速引用的日志文件中,我将以下内容另存为

~\mytodo.ps1

$input = $args
$date = Get-Date -Format "dd-MM-yyyy"

switch ($input[0]) {
    "doing" {
        $input = $input[1..($input.Length - 1)]
        Add-Content -Path ~/log.txt -Value "$(Get-Date -Format "dd-MM-yyyy") $input"
        Write-Host "`"$input`" Written to log"
    }
    "today" {
        Select-String -Path ~/log.txt -Pattern $date
    }
    "yesterday" {
        $yesterday = (Get-Date).AddDays(-1).ToString("dd-MM-yyyy")
        Select-String -Path ~/log.txt -Pattern $yesterday
    }
    "todo" {
        $input = $input[1..($input.Length - 1)]
        if ($input -eq "") {
            Get-Content ~/todo.log
        } else {
            Add-Content -Path ~/todo.log -Value "$date $input"
        }
    }
}

我发现我可以在控制台上调用这些开关,如下所示:

& $HOME/mytodo.ps1 doing "add note to the log"

然后我在我的个人资料中设置函数来调用开关,认为这些应该可以工作

function doing { & $HOME/mytodo.ps1 doing $args }
function today { & $HOME/mytodo.ps1 today $args }
function yesterday { & $HOME/mytodo.ps1 yesterday $args }
function todo { & $HOME/mytodo.ps1 todo $args }

但是,这些函数似乎将输入参数视为对象:

doing 123
doing "123"
都会产生以下结果:

"System.Object[]" Written to log

如何让每个函数调用脚本中的开关而不将输入字符串视为字符串?

powershell function switch-statement
1个回答
0
投票
  • 以下内容与您的问题无关,但值得注意:

  • 为了中继在PowerShell命令之间的自动

    $args
    变量中反映的位置参数,您必须使用splatting,即
    @args
    ,这可确保参数传递到单独(并通过目标命令再次收集在
    $args
    中)。

# Note the use of @args instead of $args
function doing { & $HOME/mytodo.ps1 doing @args }
function today { & $HOME/mytodo.ps1 today @args }
function yesterday { & $HOME/mytodo.ps1 yesterday @args }
function todo { & $HOME/mytodo.ps1 todo @args }
© www.soinside.com 2019 - 2024. All rights reserved.