我是新的PowerShell,想要从Excel中获取服务器列表,然后将其粘贴到输入窗口中。它应该隔离它并一个接一个地处理它。
即给出服务器的名称:
arvdel1 arvdel2 arvdel3 arvdel4
它应该把它作为
$a=@(arvdel1,arvdel2,arvdel3,arvdel4)
我怎样才能做到这一点?
您可以使用必需参数(对于小于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
以下是您需要的部分:
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 ','
目前还不清楚你在追求什么。
Read-Host
)将由cr/lf
序列终止,这是excel用于分隔相邻ROW的内容。因此,您需要一个循环来捕获所有粘贴的ROW。第二个问题是你不知道何时处理所有行。
复制具有多个列的范围时,它们是TAB分隔的要使用multiplte cols / rows处理unknwon剪贴板(文本)内容,我会使用(如注释中所示)Get-Clipboard
并使用基于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
我得到了解决方案。我的脚本将以数组的形式从剪贴板获取输入并为每个服务器执行任何命令。我所要做的就是从记事本中复制任意数量的服务器并运行脚本示例:$ d = @(Get-剪贴板)foreach($ i in $ d){Write-Output“Hi”}
$ 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
我在需要粘贴计算机名列表的脚本中使用它:
$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