我正在构建几个Powershell脚本,我想在其中执行的一件事是在输出的顶部吐出一行,以回显所使用的命令行。
用例是:将输出重定向到文件,并且从现在开始一年后,当有人检查该文件时,我希望他们能够从输出文件中复制/粘贴命令以重新生成相同的输出,其中唯一的差异是按时间顺序排列的。 [好吧,这有点太笼统了……第一种情况:我正在检查ACL,并且希望将来能够通过简单地复制/粘贴同一命令来对较新的数据重复相同的检查。 ]
我的脚本以参数定义开头:
[CmdletBinding()]
Param(
[string] $filter="Name -like '*'",
[string] $user=$null,
[switch] $test01=$false,
[switch] $test02=$false
)
我现在正在做的是一个后备职位,知道可以接受哪些参数,我将这些参数的名称和值转储出去
if ($user.Length -eq 0) { $u = "NULL" } else { $u = "|$user|" }
if ($test01) { $u += ", -TEST01" }
if ($test02) { $u += ", -TEST02" }
"RUN BEGINS at $((get-date).ToString('F')) -- Filter is |$filter|, User is $u"
很丑陋,甚至没有一点可移植性,而且绝对不是该命令的复制/粘贴。
无论如何,都可以将其改成命令行;但不是一般性的,也不是100%保证的。
我尝试使用$ args,但是显然,定义命名参数或CmdletBinding()都会破坏该机制,因为它始终为空。尝试了$ PsBoundParameters,Get-History甚至$ 0 .. $ 9类似bash的变量。到目前为止,我找不到能启动正在运行的脚本的命令行。
$ PsBoundParameters已经关闭,它具有所有正确的数据作为可以在命令行中建立的键,值对。但它仍然不是命令行,需要进行整顿才能将其整合为一个命令行。
Get-History更近了,因为它包含完整的命令行。问题在于它使命令在启动脚本的命令之前运行,而不是启动脚本的命令。
用完了所有选项...但是很容易接受建议。
答案 0 :(得分:1)
找到了!这就像我希望的那样简单。 [使用...发现这很痛苦]
$MyInvocation.Line
答案 1 :(得分:1)
虽然我同意$prefix = DB::getTablePrefix();
DB::update("ALTER TABLE ".$prefix."users AUTO_INCREMENT = 1000;");
将得到表面上看似您想要的文字命令,但我仍然认为$MyInvocation.Line
中的数据从长远来看更有用,因为您不能保证用户会以使命令行真正有用的方式调用函数。
考虑调用者已声明变量以保存参数值的常见情况:
$PSBoundParameters
考虑调用者创建哈希表以进行以下操作的情况:
$myfilter = "Name -like '*Joe*'"
MyFunction -filter $myfilter
如果仅记录命令行,则在这两种情况下都将丢失参数数据。而且,如果您确实希望人们可以从日志中复制/粘贴文字命令,那么根据$myParams = @{
filter = "Name -like '*Joe*'"
test01 = $true
}
MyFunction @myParams
中的数据生成综合命令就不那么困难了。只要传入相同的参数数据,就不必一定是相同的命令,对吧?