gpt4 book ai didi

powershell 添加成员使用管道并使用 $this 属性作为新属性的值

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

我是 powershell 的新手,不明白为什么这个过程有效:

$ftpFiles = Get-FTPChildItem -Session $Session -Path "/myroot" -Recurse | ForEach-Object { $_ | Add-Member -type NoteProperty -name CompareFullName -value ($_.FullName -Replace "ftp://ftp.server.com/myroot/", "") -PassThru }

这行不通:

$ftpFiles = Get-FTPChildItem -Session $Session -Path "/myroot" -Recurse | Add-Member -type NoteProperty -name CompareFullName -value ($_.FullName -Replace "ftp://ftp.server.com/myroot/", "") -PassThru

我尝试向文件对象添加一个属性 (CompareFullName),其值使用同一文件对象 (FullName) 的另一个属性。Add-Member 应该接受管道值。在非工作语法中发生的是属性添加正常但值为空。第一个语法工作正常。我希望能在不使用 foreach-object 的情况下提供解释或其他方式来实现我的目标。

最佳答案

$_ 是一个自动变量,仅在对管道中的每个项目执行的脚本 block 中才有意义。第一个示例有效,因为当您通过管道传输到 ForEach-Object 时,$_ 是为脚本 block 定义的。第二个示例不起作用,因为没有脚本 block ,所以 $_ 未定义。 AFAIK 没有 foreach 就无法做到这一点。您需要一些东西来计算管道中每个项目的值,并且 Add-Member 不接受脚本 block 来计算它附加的成员的值。我猜你是这样使用 ScriptProperty 的:

$ftpFiles = Get-FTPChildItem -Session $Session -Path "/myroot" -Recurse | Add-Member -type ScriptProperty -name CompareFullName -value {$this.FullName -Replace "ftp://ftp.server.com/myroot/", ""} -PassThru

但这在语义上与您所拥有的不同,因为它在每次访问时都会计算属性值。

根据您要执行的操作,您可以使用 Select-Object 提取有用的属性以供日后使用:

$ftpFiles = Get-FTPChildItem -Session $Session -Path "/myroot" -Recurse | select *, @{n="CompareFullName"; e={$_.FullName -replace "ftp://ftp.server.com/myroot/", ""}}

这将生成具有相同属性和附加属性“CompareFullName”的新自定义对象。

关于powershell 添加成员使用管道并使用 $this 属性作为新属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25665658/

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