我有一个包含以下信息的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。
答案 0 :(得分:0)
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想要解释的内容,则通常更容易使用%--
来停止对该行的其余部分的解析,然后将其余所有内容逐字传递给外部命令