gpt4 book ai didi

function - 管道到用户功能参数的问题

转载 作者:行者123 更新时间:2023-12-02 23:55:53 24 4
gpt4 key购买 nike

由于某种原因,我的程序拒绝在这种情况下工作:

  • 由于缺乏灵活性,我有一个自定义函数,旨在替换cmdlet
  • 我通过管道
  • 向该函数传递了一个 文件或文件夹对象。

    这是功能:
    function Get-ChildItemCustom {
    Param(
    [Parameter(ValueFromPipeline=$true)]
    [System.IO.FileSystemInfo] $item,
    [Parameter(ValueFromPipeline=$false)]
    [string] $archive_path
    )
    Process {
    Get-ChildItem $item
    }
    }

    我希望能够像 Get-ChildItem一样使用此功能:输入一个 [System.IO.FileSystemInfo]对象,并获取所有子项(与一些我未在此处包括的额外条件进行排序)作为输出。

    这就是我所谓的函​​数:
    Get-ChildItem $parentfolder_path |
    Get-ChildItemCustom |
    Do-SomethingElse

    错误返回说明 Get-ChildItem(可验证的类型为 [System.IO.FileSystemInfo])的结果被视为字符串。

    Cannot convert the "E:\Data\VHG-ITC-Test\New folder\archive" value of type "System.String" to type "System.IO.FileSystemInfo".



    参数前面的类型并不总是存在的。当 $item没有明确地具有类型时,该函数将误读输入(假定仅将 Name属性作为输入):

    Get-ChildItem : Cannot find path 'C:\Windows\system32\New folder' because it does not exist.



    因此,该功能似乎无法正确接受对象输入。我想避免不惜一切代价使用字符串,而只是移动对象。我设置的参数是否错误?我能做什么?

    最佳答案

    问题不完全在于您的函数,而是Get-ChildItem处理参数的方式(正如Moerwald在其答案中已经怀疑的那样)。

    当您使用Get-ChildItem对象作为未命名参数调用FileInfo时,该参数将传递给第一个位置参数(-Path),后者需要将字符串数组作为输入,因此该对象将转换为字符串。但是,在某些情况下,将FileInfo对象转换为字符串会扩展FullName属性,而在其他情况下,它只会扩展Name属性(不过,我无法解释PowerShell如何决定何时选择哪个)。后者就是您的情况。而且由于Get-ChildItem仅看到一个名称,而不是完整路径,因此它正在当前工作目录中查找该项目,这会失败。

    有很多方法可以避免此问题,其中Moerwald已经显示了其中一种。其他是:

  • 使用管道将$item传递给Get-ChildItem:
    function Get-ChildItemCustom {
    Param(
    [Parameter(ValueFromPipeline=$true)]
    [IO.FileSystemInfo]$item,

    [Parameter(ValueFromPipeline=$false)]
    [string]$archive_path
    )

    Process {
    $item | Get-ChildItem
    }
    }
  • 通过按名称映射属性来传递完整路径:
    function Get-ChildItemCustom {
    Param(
    [Parameter(
    ValueFromPipeline=$true,
    ValueFromPipelineByPropertyName=$true
    )]
    [string[]]$FullName,

    [Parameter(ValueFromPipeline=$false)]
    [string]$archive_path
    )

    Process {
    Get-ChildItem $FullName
    }
    }

  • 就个人而言,我更喜欢最后一个变体(通过属性名称传递)。

    关于function - 管道到用户功能参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45409507/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com