【问题标题】:How to create an array like this in powershell?如何在powershell中创建这样的数组?
【发布时间】:2021-09-15 03:04:06
【问题描述】:

我需要为 TextToColumns Excel 自动化存储如下数据。 我需要实现 Code-2 或 Code-3 或 Code-4 有什么方法可以实现吗? 我有超过 350 多个数据,所以我不能使用 Code-1,这对我来说不公平。


代码 1:工作正常

$var = (1,2),(2,2),(3,2),(4,2),(5,2),(6,2)........(300,2)
$ColumnA.texttocolumns($colrange,1,-412,$false,$false,$false,$false,$false,$true,"|",$var)


代码 2:不工作

$var = @((1,2)..(300,2))
$ColumnA.texttocolumns($colrange,1,-412,$false,$false,$false,$false,$false,$true,"|",$var)


代码 3:不工作

$var = @()
   
#forloop upto 300 
{ $var += ($i,2) }

$ColumnA.texttocolumns($colrange,1,-412,$false,$false,$false,$false,$false,$true,"|",$var)


代码 4:不工作

[array]$var = 1..300 | foreach-object { ,@($_, 2) }
$ColumnA.texttocolumns($colrange,1,-412,$false,$false,$false,$false,$false,$true,"|",$var)

【问题讨论】:

  • $var = @(1..300) | ForEach-Object { ,$(@($_,2)) }?
  • Bro code-2,code-3,您的代码也可以正常分配值,但不能使用 Text-To-Columns 函数......给出错误
  • 如果我运行例如$var1 = (1,2),(2,2),(3,2); $var2 = @(1..3) | ForEach-Object { ,$(@($_,2)) 然后Compare-Object $var1 $var2 -IncludeEqual 表明对象$var1$var2 是相同的……
  • 检查此代码兄弟,我在下面的链接中放置了两个文件,您可以在您的系统上运行它github.com/dinesh-ponnusamy/powershell-code 注释第 32 行和取消注释第 29 行,反之亦然以查看错误
  • 抱歉,我不能使用没有有效 Excel 许可证的Excel.Application COM 对象...

标签: arrays powershell powershell-4.0 excel-automation


【解决方案1】:

我无法完全解释这里发生了什么,但我想这与 texttocolumns 需要(延迟)表达式而不是(评估)对象

意味着以下内容似乎适用于来自@mclaytonMinimal, Reproducible Example

$Var = Invoke-Expression ((1..6 |% { "($_, `$xlTextFormat)" }) -Join ',')

并期望以下内容可以解决初始问题中的问题:

$Var = Invoke-Expression ((1..300 |% { "($_, 2)" }) -Join ',')

【讨论】:

  • 有效!很好的发现。我自己尝试了很多东西,但我什至没有想到 Invoke-Expression +100 到 iRon
【解决方案2】:

不是答案 - 只是记录一些研究以节省其他人一些时间...

我可以使用以下代码在此处重现该问题:

$xl = new-object -com excel.application;
$xl.Visible = $true;

$workbook  = $xl.Workbooks.Add();

$worksheet = $workbook.Worksheets.Item(1);

$worksheet.Range("A1") = "aaa|111";
$worksheet.Range("A2") = "bbb|222";
$worksheet.Range("A3") = "ccc|333";
$worksheet.Range("A4") = "ddd|444";
$worksheet.Range("A5") = "eee|555";
$worksheet.Range("A6") = "fff|666";

这样构建一个新的电子表格:

如果您随后运行以下命令,它将解析 A 列的内容并将结果放入 B 和 C 列:

$range  = $worksheet.Range("A:A");
$target = $worksheet.Range("B1");

# XlColumnDataType enumeration
# see https://docs.microsoft.com/en-us/office/vba/api/excel.xlcolumndatatype
$xlTextFormat = 2;

# XlTextParsingType enumeration
# see https://docs.microsoft.com/en-us/office/vba/api/excel.xltextparsingtype
$xlDelimited = 1;

# XlTextQualifier enumeration
# https://docs.microsoft.com/en-us/office/vba/api/excel.xltextqualifier
$xlTextQualifierNone = -4142;

$var = (1,$xlTextFormat),(2,$xlTextFormat),(3,$xlTextFormat),(4,$xlTextFormat),(5,$xlTextFormat),(6,$xlTextFormat);

# parse the values in A1:A6 and puts the values in a 2-dimensional array starting at B1
# see https://docs.microsoft.com/en-us/office/vba/api/excel.range.texttocolumns
$result = $range.TextToColumns(
    $target,              # Destination
    $xlDelimited,         # DataType
    $xlTextQualifierNone, # TextQualifier
    $false,               # ConsecutiveDelimiter
    $false,               # Tab
    $false,               # Semicolon
    $false,               # Comma
    $false,               # Space
    $true,                # Other
    "|",                  # OtherChar
    $var                  # FieldInfo
);

然后看起来像这样:

但是,如果您将 $var 的声明更改为

$var = 1..6 | % { ,@($_, $xlTextFormat) };

你得到以下错误:

OperationStopped: The remote procedure call failed. (0x800706BE)

Excel 实例终止。

所以这两个声明有些东西不同:

$var = (1,$xlTextFormat),(2,$xlTextFormat),(3,$xlTextFormat),(4,$xlTextFormat),(5,$xlTextFormat),(6,$xlTextFormat);

$var = 1..6 | % { ,@($_, $xlTextFormat) };

但那是什么让我无法理解:-S

【讨论】:

  • 确实知道如何实现这一点,因为我目前正在使用此代码$var=(1,2),(2,2),.....(350,2) 我想优化我提出问题的过程。我可以接受 for-loop、for-each 或单行赋值……
猜你喜欢
  • 2012-06-23
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多