csv 在PSobject上添加一个成员后,从Psske Rest-Method接收它会导致Object为$null

3pmvbmvn  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(82)

我正在使用Ricke-RestMethod从列表中自动收集有关IP地址的信息。虽然这本身就像微风一样工作,但我需要为计算机每次向API端点进行查询时添加时间戳,这就是将整个内容导出到CSV文件时出现问题的地方:
从今天开始,我对PowerShell非常陌生(除了在IT帮助台工作时简单地运行一些预先编写的脚本),但目前存在以下问题:
当将数据附加到输出路径中的CSV文件时,不会发生任何问题-但当然缺少时间戳作为列的要求。
然而,当我尝试使用Add-Member方法将新的hashvalue添加到查询产生的PS对象时(或者当我简单地导入csv,添加带有时间戳的列并将其导出回输出文件时),整个过程都会导致$null。
为什么会发生这种情况?有没有什么方法可以在每次迭代后正确地将这些时间戳添加到CSV中?
代码片段:

try { 
        $timestamp = Get-Date -Format "dd.MM.yyyy HH:mm"
        Invoke-RestMethod @Params 
        | Select-Object ip, country_code, as, is_proxy
        | Add-Member -MemberType NoteProperty -Name "query_date_and_time" -Value $timestamp
        | Export-Csv $OutputPath -Append
        
        # $arr += $Result

        Write-Host "$Result"
        
    } catch { 
        Throw $_.Exception
    }
r3i60tvu

r3i60tvu1#

Add-Member小程序有点不寻常,因为它修改了它的输入对象 *,而不是 * 输出 * 修改后的对象,并且默认情况下不产生 * 输出 * -这就是为什么Export-Csv没有接收到输入。
但是,您也可以使用-PassThru开关请求输出修改后的对象。
因此(管道重新格式化为与Windows PowerShell兼容):

Invoke-RestMethod @Params | 
  Select-Object ip, country_code, as, is_proxy |
  Add-Member -PassThru -MemberType NoteProperty -Name 'query_date_and_time' -Value $timestamp |
  Export-Csv $OutputPath -Append

顺便说一句:

  • -Append将在每次运行时附加到预先存在的输出文件。相反,如果意图是在每次运行时完整地写入文件(重新),则忽略-Append
  • 由于技术原因,[string]示例和.NET * 值类型的示例 * 不能 * 就地修改,在这种情况下,您需要将合并-PassThru与将结果赋值回输入变量(例如,$var = 101; $var = $var | Add-Member -PassThru Foo Bar)相结合;然而,这些类型的装饰示例是 * 最好避免 *,原因在this answer的底部部分解释。

相关问题