我正在尝试编写一个简单的日志记录脚本,将待办事项保存到我可以快速引用的日志文件中,我将以下内容另存为
~\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
如何让每个函数调用脚本中的开关而不将输入字符串视为字符串?
以下内容与您的问题无关,但值得注意:
$input
变量用于自定义目的。为了要中继在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 }