为什么从函数调用时,PowerShell代码的行为有所不同?

时间:2019-01-08 12:37:22

标签: powershell

在这里学习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

有人可以帮助我理解为什么称为内联的代码可以工作,但是当我将其包装为函数时却无法使用相同的代码吗?

1 个答案:

答案 0 :(得分:2)

$Input是一个自动变量。

转储文件参数的名称更改为$somethingelse将解决您的问题。永远不要使用$input作为参数或变量名。

自动变量应被视为只读变量。

  

关于自动变量

     

简短说明

     

描述存储状态信息的变量   电源外壳。这些变量是由PowerShell创建和维护的。

     

详细说明

     

从概念上讲,这些变量被认为是   只读。即使可以写入,也可以向后   兼容性,不应将其写入。

     

以下是PowerShell中自动变量的列表:

     

...

     

$ INPUT

     

包含一个枚举器,该枚举器枚举传递给函数的所有输入。 $ input变量仅对函数和脚本块(未命名的函数)可用。在函数的Process块中,$ input变量枚举了当前在管道中的对象。当Process块完成时,管道中没有任何对象,因此$ input变量枚举一个空集合。如果该函数没有Process块,则在End块中,$ input变量枚举该函数的所有输入的集合。

来源:About_Automatic_Variables

此信息也可以通过Get-help命令获得

Get-Help about_Automatic_Variables