我是新的Powershell,并且想要从Excel中获取服务器列表,并将其从字面上粘贴到输入窗口中。它应该将其隔离并一个接一个地处理。
ie 给出服务器的名称:
arvdel1 arvdel2 arvdel3 arvdel4
,它应该作为
$a=@(arvdel1,arvdel2,arvdel3,arvdel4)
我该怎么做?
答案 0 :(得分:1)
您可以使用类型为String数组[string []]的必需参数(对于Powershell版本小于5.1或“ Get-Clipboard”对于版本5.1或更高版本)。它将提示您输入每个数组元素的值,直到检测到输入的空行为止。
我最近通过查看脚本的输入参数了解了这一点。多年以来,我一直在使用Excel的转置功能将文本处理为PowerShell单行数组格式,并在记事本中替换“ Tab”字符。
仅供参考,PowerShell单行数组格式为(“ 1”,“ 2”,“ 3”,“ 4”,“ 5”)
...
param
(
[parameter(Mandatory = $true)]
[string[]]
$listOfStrings
)
...
提示输入字符串数组的示例
Supply values for the following parameters:
listOfStrings[0]:
我在记事本(或Excel)中创建了一个1到5的列表,并将其直接复制到PowerShell窗口中。下面是我的示例输出。
1
2
3
4
5
Supply values for the following parameters:
listOfStrings[0]: 1
listOfStrings[1]: 2
listOfStrings[2]: 3
listOfStrings[3]: 4
listOfStrings[4]: 5
listOfStrings[5]:
1
2
3
4
5
答案 1 :(得分:0)
这是您需要的零件:
try {
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Open('E:\Temp\Data.xlsx')
$xlSheet = $excel.Sheets.Item('Sheet1')
$a = @($xlSheet.Range("A1:A4").Value2)
#prefered to use named range
#$xlSheet.Range("Items").Value2
} finally {
$workbook.Close()
$excel.Quit()
[Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
}
$a | sort | % {
#process
"Processing: $_"
}
编辑: 要分割字符串,请使用-split:
'arvdel1,arvdel2,arvdel3,arvdel4' -split ','
答案 2 :(得分:0)
不清楚你要干什么。
Read-Host
)将以cr/lf
序列终止,这是excel用于分隔相邻 ROWs 的方式。因此,您将需要一个循环来捕获所有粘贴的行。第二个问题是您不知道何时处理所有行。要使用我要使用的多列cols /行(如注释中所建议的那样)Get-Clipboard
处理unknwon剪贴板(文本)内容,然后将基于RegEx的拆分运算符与OR一起使用以拆分TAB 或 CR / LF
> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4
> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4
> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4
arvdel2
C3
D3
E3
arvdel3
C4
D4
E4
arvdel4
C5
D5
E5
您当然可以将变量分配给变量,也可以直接附加ForEach-Object
来处理它们,而不是输出到控制台。
编辑:直接从PowerShell中读取上述excel文件的替代方法
使用DFinke's ImportExcel module:
> import-excel .\Data.xlsx
ServersCol
----------
arvdel1
arvdel2
arvdel3
arvdel4
答案 3 :(得分:0)
我找到了解决方案。我的脚本将以数组形式从剪贴板输入并为每个服务器执行任何命令。我要做的就是从记事本中复制任意数量的服务器并运行脚本 样品: $ d = @(获取剪贴板) foreach($ d中的$ i) { 写输出“ Hi” }
答案 4 :(得分:0)
$ cli =读取主机(“输入服务器”) $ a = $ cli.Replace(“`n”,“,”) $ b = $ a.split(“,”) foreach($ i在$ b中) { 写主机“嗨” }
o / p:
输入服务器:1.1.1.1 2.2.2.2 3.3.3.3 你好 你好 嗨
答案 5 :(得分:0)
我在需要粘贴计算机名称列表的脚本中使用它:
//time.Sleep(10*time.Second)
conn.Close()
要确认粘贴的列表是唯一对象,请运行$ PCQueryList.count和$ MultilineInput.count
arvdel1 arvdel2 arvdel3 arvdel4
$ $ PCQueryList.count 4
$ $ MultilineInput 1