我不知道如何在这里做一个最小的工作代码示例,但我至少会尝试解释发生了什么。
我有一个实用程序处理一些文本文件以提取数据,然后以各种方式提供该数据,这取决于推荐行选项和XML文件中的一些数据。我可以在数据中查找各种“进程”,并且可以以一种或多种格式(txt,csv,xml)输出最终数据,并可能将不同的“进程”输出到不同的文件类型。由于我正在处理数百个txt文件,我想要多三个这个。所以我创建了一个函数,因为监视和输出类型的进程混合对于每个txt文件是相同的,然后我想在最后编译成单个大数据结构,我创建了最终数据结构作为散列的散列,但是没有数据。然后我用
Set-Variable resultsContainer -option:constant -value:$results
使一个常数(没有数据)转交给函数。我的想法是,我可以将函数交给空容器加上txt文件的路径,它可以填充容器并返回它,理论上我可以用它来填充可变数据容器。所以我对txt文件做了一个foreach,并且每次都应该传递一个空容器,就像这样。
$journalResults = Invoke-PxParseJournal -journal "$source\$journal" -container $resultsContainer
然而,正如我所期望的那样,不是保持空白,而是将所有以前的期刊数据有效地传递给函数的每个连续迭代。我通过将计数器初始化为1然后在Invoke-PxParseJournal调用之后运行此循环来证明这一点。
foreach ($process in $resultsContainer.Keys) {
foreach ($output in $resultsContainer.$process.Keys) {
foreach ($item in $resultsContainer.$process.$output) {
Write-Host "$(Split-Path $journal -leaf) $process $output $item$('!' * $count)"
}
}
}
在第一次调用之后,循环不产生任何东西,但是从那里附加了一切。所以我看到这样的结果
journal.0002.txt Open_Project csv Gordon,1/20/2017 12:08:43 AM,Open an existing project,.\RFO_Benchmark - previous.rvt,0:00:22.012!!
journal.0003.txt Open_Project csv Gordon,1/20/2017 12:08:43 AM,Open an existing project,.\RFO_Benchmark - previous.rvt,0:00:22.012!!!
journal.0004.txt Open_Project csv Gordon,1/20/2017 12:08:43 AM,Open an existing project,.\RFO_Benchmark - previous.rvt,0:00:22.012!!!!
每次都重复相同的重复。甚至更奇怪,如果我在控制台中重新运行脚本,我会收到错误说
Set-Variable : Cannot overwrite variable resultsContainer because it is read-only or constant.
但结果仍然是附加数据。现在,我的第一个想法是,因为我在函数中使用与根脚本中相同的变量名称,我正在处理一些范围问题,所以我在函数中更改了变量的名称并给它一个别名,就像这样
[Alias('container')]$parseJournal
然后我填充并返回$ parseJournal变量。 行为没有变化。现在我想知道我是否只是不明白参数是如何传递的。我以为它是ByVal,但这就像是ByReference,所以即使名称改变,我实际上每次只是在内存中添加相同的数据结构。
这里有什么明显的东西让我失踪吗? FWIW<我现在在PS 2.0。我没有Win10 VM,我现在可以很容易地在那里进行测试。