在这里学习PowerShell的经验丰富的C#开发人员,所以我确定我只是想念一些愚蠢的东西。我想要做的是编写一个函数,该函数将其输入内容简单地写入JSON格式的临时文件中。如果我以“内联”方式运行它,那么我的代码可以正常运行,但是在函数中调用该代码时会写入一个空文件。
这是代码:
function Dump-File {
param (
[Parameter(Mandatory=$true)]
$Input
)
$tmp = New-TemporaryFile
$Input | ConvertTo-Json | Out-File $tmp.FullName
Write-Output "Dump file written: $($tmp.FullName)"
}
$args = @{}
$args.Add('a', 1)
$args.Add('b', 2)
$args.Add('c', 3)
$args.Add('d', 4)
# results in json written to temp file
$tmp = New-TemporaryFile
$args | ConvertTo-Json | Out-File $tmp.FullName
Write-Output "args dumped: $($tmp.FullName)"
# results in empty temp file
Dump-File $args
有人可以帮助我理解为什么称为内联的代码可以工作,但是当我将其包装为函数时却无法使用相同的代码吗?
答案 0 :(得分:2)
$Input
是一个自动变量。
将转储文件参数的名称更改为$somethingelse
将解决您的问题。永远不要使用$input
作为参数或变量名。
自动变量应被视为只读变量。
关于自动变量
简短说明
描述存储状态信息的变量 电源外壳。这些变量是由PowerShell创建和维护的。
详细说明
从概念上讲,这些变量被认为是 只读。即使可以写入,也可以向后 兼容性,不应将其写入。
以下是PowerShell中自动变量的列表:
...
$ INPUT
包含一个枚举器,该枚举器枚举传递给函数的所有输入。 $ input变量仅对函数和脚本块(未命名的函数)可用。在函数的Process块中,$ input变量枚举了当前在管道中的对象。当Process块完成时,管道中没有任何对象,因此$ input变量枚举一个空集合。如果该函数没有Process块,则在End块中,$ input变量枚举该函数的所有输入的集合。
此信息也可以通过Get-help
命令获得
Get-Help about_Automatic_Variables