如何使用输入文件来输入powershell命令?

时间:2019-02-05 20:13:05

标签: 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。

1 个答案:

答案 0 :(得分:0)

Import-CsvForEach-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想要解释的内容,则通常更容易使用%--来停止对该行的其余部分的解析,然后将其余所有内容逐字传递给外部命令