在编写下面的PowerShell脚本以及使用循环和分支时,我遇到了一个基本问题。看起来我遗漏了一些非常简单的东西,但现在我不知道如何改进脚本。
这里有一个例子:
$mycsv = Import-Csv mycsv.csv
for ($i = 1 ; $i -le 123 ; $i++) {
$currentvalue = "OLD"
foreach ($value in $mycsv) {
switch ($value.oldValue) {
$currentvalue {
Write-Host "Number $i - $currentvalue replaced with $($value.newValue)"
}
default { Write-Host "Number $i - $currentvalue unchanged" }
}
}
}
mycsv.csv文件包含以下三行:
oldValue,newValue
FOO,BAR
OLD,NEW
ABC,DEF
电流输出如下:
...
Number 123 - OLD unchanged
Number 123 - OLD replaced with NEW
Number 123 - OLD unchanged
...
如您所见,脚本为每个数字写入三行,这是意料之中的,因为脚本为CSV文件中的三个条目提供了foreach
循环。
但是我希望脚本显示操作的状态,而不是每个条目的oldValue与newValue匹配的状态。
我需要在脚本中做什么修改才能显示“未更改”字符串或“已替换”字符串?我需要在某个地方添加break
以使脚本退出foreach
循环吗?还是需要用其他内容替换foreach
?
PS我明白我的脚本现在实际上并没有替换任何东西,它只是基于$currentvalue和CSV文件中的条目显示输出。
更新#1
我尝试基于$currentvalue
和mycsv.csv
中的行Write-Host
不同的文本。如果脚本在mycsv.csv
的第一列中找到$currentvalue
的值,那么它必须写入“编号1 -旧替换为新”,其中新取自CSV文件的同一行($value.newValue)。
你可以把它想象成我使用CSV文件作为一个引用,例如,如果脚本解析一个文本文件并发现单词OLD,它需要用从CSV中提取的单词NEW替换它。
我试图简化我的脚本,只留下相关的部分。它有一点多的代码,但我故意把它省略了,因为它在这个问题的上下文中并不重要。
我打算使用foreach
循环遍历CSV文件中的条目,并将它们与$currentvalue
匹配。当$currentvalue
与CSV第一列中的条目之一匹配时,脚本需要写入“编号1 -(第一列中的单词)替换为(第二列中的单词)"。
如果没有匹配项,则脚本应写入“编号1 - $currentvalue未更改”。
因此,应该只有两种类型的输出:
“编号1 -(取自第一列的单词)替换为(取自第二列的单词)”(如果匹配)
“编号1 - $currentvalue未更改”(如果未找到匹配项)
脚本需要for
循环,因为它必须迭代修订号。我将$i
传递给一个命令行实用程序。我省略了脚本的这一部分,因为它在这里不重要。
1条答案
按热度按时间xggvc2p61#
给定该测试Csv:
我相信你想要的是:
它将输出:
我认为您应该采用面向对象的方法:
它将输出: