Powershell的新手并寻求一些帮助。我有多个xyz文件,当前显示的z值为正值,我需要将所有值设为负值(或z-positive down)。到目前为止,我最好的尝试是尝试从其他代码行中拼凑出我所知道的内容,但我还远未找到解决方案。
$data = Get-ChildItem "C:\Users\dwilson\Desktop\test" -Recurse |
foreach ($item in $data) {$item.'Col 3' = 0 - $item.'Col 3'}
非常感谢任何帮助!
答案 0 :(得分:0)
使用Get-ChildItem
返回的文件循环,您可以使用Import-CSV
参数为-Header
导入每个文件,为每列分配属性名称。然后我们可以更新该属性的信息然后导出它。使用ConvertTo-CSV
cmdlet,然后使用Select-Object -Skip 1
,我们可以在导出之前将标头从CSV中删除。
$Files = Get-ChildItem "C:\Users\dwilson\Desktop\test" -Recurse
foreach ($File in $Files) {
$Data = Import-CSV $File -Header 'Col1','Col2','Col3'
$newData = ForEach ($Row in $Data) {
$Row.'Col3' = 0 - $Row.'Col3'
$Row
}
$newData |
Convertto-CSV -NoTypeInformation |
Select-Object -Skip 1 |
Out-File "$($File.Fullname).new)"
}
答案 1 :(得分:0)
有点暂时,但你在这里使用混合语法。
foreach ($i in $set) { ... }
这是Foreach
statement。它不接受来自管道的输入,也不会自动将输出发送到管道。另请参阅Get-Help about_Foreach
。
Get-ChildItem | ForEach-Object { ... }
这是ForEach-Object
command。它接受来自管道的输入并将输出发送到管道。重要的是,此命令还具有默认别名foreach
。另请参阅Get-Help ForEach-Object
。
Foreach
语句的帮助解释了PowerShell如何决定foreach
的含义(强调我的):
当
Foreach
出现在命令管道中时,PowerShell使用foreach
别名,该别名调用ForEach-Object
命令。 在命令管道中使用foreach
别名时,不会像使用($<item> in $<collection>)
语句那样包含Foreach
语法。这是因为先前的管道中的命令提供此信息。