首页 > 解决方案 > 如何使用输入文件来提供 powershell 命令?

问题描述

我有一个包含以下信息的 csv 文件(为了便于阅读,我删除了逗号):

box1    1.1.1.1     user        password
box2    2.2.2.2     user        password
box3    3.3.3.3     user        password

我需要使用 csv 文件中的参数执行命令,如下所示:

plink -l user -pw password 1.1.1.1 lsvdisk -delim , -nohdr

并提供一个文件,每行的开头都有框名称。

换句话说,我有大约 300 个存储盒 (V7k/SVC),我需要一份 LUN 的所有 UUID 的清单。最好是powershell。

标签: powershell

解决方案


Import-Csv是你的ForEach-Object朋友吗:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr
}

请注意,我们必须将,引号括起来以确保它作为单个参数传递。¹

的脚本块内ForEach-Object $_是当前对象,它具有 CSV 文件中的属性。我们必须提供导入自定义标头,因为您的文件显然没有任何标头。如果这不是您的文件的外观,请进行相应调整。

这将为您提供大量输出,其中主机名可能不再可用。根据输出的外观,解析它并将其包装成漂亮的对象可能是有意义的,但我真的不知道输出的外观。简单地捕获输出并将其与主机名相关联的简单方法如下:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  $output = plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr
  New-Object PSObject -Property @{
    Host = $_.Host
    Output = $output
  }
}

要在输出的每一行加上主机名前缀,您可以再次循环输出:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  $host = $_.Host
  plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr | ForEach-Object {
    "${host}: $_"
  }
}

¹ 如果命令行包含许多 PowerShell 想要自行解释的内容,通常更容易使用它%--来停止解析该行的其余部分,然后将其余部分逐字传递给外部命令。


推荐阅读