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

Paste data from Excel and convert into an array?

我是新的 powershell,想从 Excel 中获取服务器列表,然后直接粘贴到输入 window 中。应该分开处理,一个接一个处理。

即 给出服务器名称:

arvdel1
arvdel2
arvdel3
arvdel4

应该是

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

我该怎么做?

这是您需要的部分:

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

不清楚你在找什么。

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

要使用 multiplte cols/rows 处理 unknwon 剪贴板(文本)内容,我会使用(如评论中所建议的)Get-Clipboard 并使用基于 RegEx 的拆分运算符和 OR 进行拆分一个 TABCR/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

我得到 solution.My 脚本将从剪贴板以数组形式获取输入并为每个 server.All 执行任何命令我必须做的是从记事本和 [=15 复制任意数量的服务器=] 脚本 样本: $d = @(获取剪贴板) foreach($d 中的 $i) { 写输出 "Hi" }

$cli=读取主机("Enter the servers") $a=$cli.Replace("`n",",") $b=$a.split(",") foreach($i in $b) { 写主机“嗨” }

o/p:

输入服务器:1.1.1.1 2.2.2.2 3.3.3.3 你好 你好 嗨

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

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

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

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

arvdel1 arvdel2 arvdel3 arvdel4

$$PCQueryList.count 4

$ $多行输入 1

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

我最近通过查看脚本的输入参数弄明白了这一点。多年来,我一直在使用 Excel 的转置和替换记事本中的 'Tab' 个字符将文本处理成 PowerShell 单行数组格式。

仅供参考 PowerShell 单行数组格式为 ("1", "2", "3", "4", "5")

...
param
(
    [parameter(Mandatory = $true)]
    [string[]]
    $listOfStrings
)
...

填充字符串数组的示例提示

Supply values for the following parameters:
listOfStrings[0]:

我在记事本(或 Excel)中创建了 1 到 5 的列表,并将其直接复制到 PowerShell window。下面是我的示例输出。

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