powershell - 如何使用输入文件来提供 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。
解决方案
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 想要自行解释的内容,通常更容易使用它%--
来停止解析该行的其余部分,然后将其余部分逐字传递给外部命令。
推荐阅读
- java - 如何连接两个字符串并省略可能的重复单词?
- python - 在 Anaconda 中导入漂亮表的问题
- amazon-web-services - SVL_MV_REFRESH_STATUS 未填充其所有字段
- javascript - AFRAME 三.js 性能提升
- javascript - AlpineJS 多级滑动移动菜单
- json - 使用从 JSON 配置文件中读取的值进行参数喷溅
- node.js - 告诉用户您在地图回调中传递了一个值
- c# - 如何通过代理连接到 Azure 服务总线主题 - C#?
- html - 部署受阻
- r - “从 FUN 返回的分数不是数字,不能将‘闭包’类型强制转换为‘双’类型的向量”