使用PowerShell,我试图从CSV文件中获取信息,并执行基于两列数据的两个命令。第一部分数据是一个资产,它需要将一个唯一文件复制到一个文件夹中,并已重命名为config.txt。
第二段数据是计算机的名称,以便将收到唯一文件的文件夹复制到指定的计算机。例如,
第一个命令:
Copy-Item "c:folder1$asset.txt" -Destination "f:folder2config.txt"
第二个命令:
robocopy /e folder2 \$ComputerNamefolder3
数据导入自csv文件,该文件有asset
和computername
两列。下面的脚本是许多变体中的一个,包括下面的脚本在内,没有一个是有效的。如有任何帮助,不胜感激。
Computers.csv
包含以下
A12345 CN12345
A54321 CN54321
脚本:
Import-Csv -Delimiter ',' -Path c:tempcomputers.csv -Header 'Asset','ComputerName’ |
ForEach-Object {
$asset += $_.asset
$ComputerName += $_.NBN
Copy-Item "c:folder1$asset.txt" -Destination "f:folder2config.txt"
robocopy /e f:folder2 \$ComputerNamefolder3
}
我已经完成了脚本,结果如下。脚本做了我想要的,除了我必须手动更改数组中项目的位置。我想让它自动完成,但我还没想好那部分。我期望csv文件包含50个或更多的资产和计算机名,并且不期望输入每个项目的位置并运行脚本50次。有没有一种自动遍历数组的方法?
$computers = Import-Csv -Path c:tempcomputers.csv -Header 'Asset','ComputerName'$asset = $computers[0].asset$ComputerName = $computers[0]。ComputerName
ForEach-Object {
Copy-Item "c:folder1$asset.txt" -Destination "f:folder2config.txt"
robocopy /e /is "f:folder2" "\$ComputerNamec$folder3"
}
首先,确保您的csv不包含标题。如果是这样,并且您使用-header
标志,则将向内容添加重复的标头。
我使用csv测试了这个解决方案,没有头,内容如下:
abc,123,
def,456,
ghi,789
每当我调试涉及在循环中访问值的代码时,我喜欢编写一些代码将这些值写入控制台,像这样:
$assetIndex = 0
Import-Csv -Header Asset,ComputerName -Path C:noHeader.csv |
ForEach-Object {
Write-Host ([string]::Concat('Asset at index ',$assetIndex, ': The asset value is "', $_.Asset, '", The computer name is "', $_.ComputerName,'"'))
$assetIndex++
}
运行该语句将证明我们正确地访问了循环中的值。最后,当使用$_
访问值时,字符串连接在循环内可能会有点混乱。
下面是如何在循环中构建copy-item
文件路径的两个示例:
#example 1
"c:folder1$($_.asset).txt"
#example 2
[string]::Concat('c:folder1',$_.Asset, '.txt')
把它们放在一起我们得到:
Import-Csv -Header Asset,ComputerName -Path C:noHeader.csv |
ForEach-Object {
Copy-Item "c:folder1$($_.asset).txt" -Destination "f:folder2config.txt"
robocopy /e /is "f:folder2" "\$($_.ComputerName)c$folder3"
}
当把变量放在引号内时,如果你想访问该变量的属性,那么你需要使用$($myVariable.someProperty)
语法,否则.someProperty
将被解释为字符串。