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

问题描述 投票:0回答:6

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

即给出服务器的名称:

arvdel1
arvdel2
arvdel3
arvdel4

它应该把它作为

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

我怎样才能做到这一点?

powershell powershell-v2.0 powershell-v3.0 powershell-remoting
6个回答
1
投票

您可以使用必需参数(对于小于5.1的Powershell版本或对于版本5.1或更高版本的'Get-Clipboard')具有String数组类型[string []]。它将提示您输入每个数组元素的值,直到它检测到输入的空行。

我最近通过查看脚本的输入参数来解决这个问题。多年来,我一直使用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

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 ','

0
投票

目前还不清楚你在追求什么。

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

要使用multiplte cols / rows处理unknwon剪贴板(文本)内容,我会使用(如注释中所示)Get-Clipboard并使用基于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

0
投票

我得到了解决方案。我的脚本将以数组的形式从剪贴板获取输入并为每个服务器执行任何命令。我所要做的就是从记事本中复制任意数量的服务器并运行脚本示例:$ d = @(Get-剪贴板)foreach($ i in $ d){Write-Output“Hi”}


0
投票

$ cli = Read-Host(“输入服务器”)$ a = $ cli.Replace(“`n”,“,”)$ b = $ a.split(“,”)foreach($ i in $ b) {write-host“hi”}

o / p:

输入服务器:1.1.1.1 2.2.2.2 3.3.3.3 hi hi hi


0
投票

我在需要粘贴计算机名列表的脚本中使用它:

$MultilineInput = Read-Host "Enter List of Computer Names"

$PCQueryList = @"
$MultilineInput
"@ -split '\r\n'

要确认您的粘贴列表是唯一对象,请运行$ PCQueryList.count和$ MultilineInput.count

arvdel1 arvdel2 arvdel3 arvdel4

$ PCQueryList.count 4

$ $ MultilineInput 1

© www.soinside.com 2019 - 2024. All rights reserved.