从Excel粘贴数据并转换为数组?

时间:2018-09-06 10:59:54

标签: powershell powershell-v2.0 powershell-v3.0 powershell-remoting

我是新的Powershell,并且想要从Excel中获取服务器列表,并将其从字面上粘贴到输入窗口中。它应该将其隔离并一个接一个地处理。

ie 给出服务器的名称:

arvdel1
arvdel2
arvdel3
arvdel4

,它应该作为

$a=@(arvdel1,arvdel2,arvdel3,arvdel4)

我该怎么做?

6 个答案:

答案 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)

不清楚你要干什么。

  • 您根本无法将Excel单元格范围粘贴到Powershell控制台提示符中而不会出现很多错误。
  • PowerShell脚本 可以在自己的提示下等待接受输入,
    • 这里的第一个问题是单个输入(Read-Host)将以cr/lf序列终止,这是excel用于分隔相邻 ROWs 的方式。因此,您将需要一个循环来捕获所有粘贴的行。第二个问题是您不知道何时处理所有行。
    • 复制具有多列的范围时,它们被 TAB 分隔

要使用我要使用的多列cols /行(如注释中所建议的那样)Get-Clipboard处理unknwon剪贴板(文本)内容,然后将基于RegEx的拆分运算符与OR一起使用以拆分TAB CR / LF

paste excel columns

> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4

paste excel rows

> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4

paste excel clumns and rows

> (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