使用PowerShell,我尝试从CSV文件中获取信息,并执行基于两列数据的两个命令。第一条数据是一个资产,它需要将一个唯一的文件复制到一个文件夹,并重命名为config。txt文件。
第二段数据是计算机的名称,该计算机将接收到唯一文件的文件夹复制到指定的计算机。比如说;
第一个命令:
Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"
第二命令:
robocopy /e folder2 \\$ComputerName\folder3
数据是从一个csv文件导入的,该文件有两列asset
和computername
。脚本如下,是许多变体之一,其中没有一个工作,包括下面的一个。任何帮助将不胜感激。Computers.csv
包含以下内容
A12345 CN12345
A54321 CN54321
脚本:
Import-Csv -Delimiter ',' -Path c:\temp\computers.csv -Header 'Asset','ComputerName’ |
ForEach-Object {
$asset += $_.asset
$ComputerName += $_.NBN
Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"
robocopy /e f:\folder2 \\$ComputerName\folder3
}
我写了剧本,结果如下。该脚本做我想做的事情,除了我必须手动更改数组中项的位置。我想自动完成这一点,但还没有弄清楚这一部分。我希望csv文件包含50个或更多的资产和计算机名,并不期望输入每个项目的位置并运行脚本50次。有没有办法自动穿越阵列?
$computers = Import-Csv -Path c:\temp\computers。csv -标头“Asset ','ComputerName' $asset = $computers[0]。asset $ComputerName = $computers[0]。计算机名称
ForEach-Object {
Copy-Item "c:\folder1\$asset.txt" -Destination "f:\folder2\config.txt"
robocopy /e /is "f:\folder2\" "\\$ComputerName\c$\folder3"
}
1条答案
按热度按时间bkkx9g8r1#
首先,确保你的csv没有包含头文件。如果是这样,并且您使用了
-header
标志,则会向内容中添加重复的头。我使用csv测试了这个解决方案,没有header,内容如下:
每当我调试涉及在循环中访问值的代码时,我喜欢编写一些代码来将这些值写入控制台,如下所示:
运行它将证明我们正确地访问了循环中的值。最后,当使用
$_
访问值时,循环中的字符串连接可能会有点混乱。下面是两个例子,说明如何在循环中构建
copy-item
文件路径:把所有这些放在一起,我们得到:
当将变量放在引号内时,如果你想访问该变量的属性,那么你需要使用
$($myVariable.someProperty)
语法,否则.someProperty
将被解释为字符串。