使用CSV作为系统名称的多个位置的Powershell复制项目

时间:2018-06-29 15:19:23

标签: powershell csv copy-item

我有一个带有98个系统名称的CSV,每个系统都有一个我需要的文件。它们都位于每台计算机上的同一文件夹中,但是文件名是唯一的。

我想使用Array ( [Items] => Array ( [0] => Array ( [SKU] => 123 [Quantity] => 13 [ProductName] => tet prod [Description] => blah blah ... 将文件复制到本地计算机上的某个位置。

copy-item

运行此命令时,我在98台计算机上均出现错误。每个错误如下所示:

  

Copy-Item:找不到路径'C:\ Users \\ @ {D113978 = Y118834}',因为它不存在。   在\\ CopyAuditFiles.ps1:3 char:16   + ...每个对象{复制项目$ AutoPaths-目标“ C:\ DTS \ BMC \ Audit Resul ...

$AutoCADs = Import-csv "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv" $AutoPaths = "\\" + $AutoCADs + "\C$\DTS\BMC\Autodesk Audit\Information\*" foreach-object{Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse} 令我感到困惑,因为每个错误都有一个相似的字符串。 @{D113978=Y118834}是CSV中的第一个系统名称。

每个错误都会更改另一个系统名称(在此示例中为D113978),第一个错误在csv中包含第二项,第二个错误在CSV中具有第三项,等等。

因此该脚本似乎在查看每个系统名称,但根本没有用系统名称来完成我想要的工作。

有人可以指出我的缺点吗?

2 个答案:

答案 0 :(得分:3)

您的csv不好。您应该为每列添加标题名称。 Powershell将每一列的第一行作为该列的标题名称,这就是为什么会出现该令人困惑的错误的原因。因此,在顶部添加另一行,并使用标题名称,例如“ Computername”。

$AutoCADs实质上也是一个表对象。您将传递整个表以创建动态网络路径。

因此将您的代码更改为此:

$AutoCADs = Import-csv "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv"

Foreach ($Row in $AutoCADs)
{
    $AutoPaths = "\\" + $($Row.Computername) + "\C$\DTS\BMC\Autodesk Audit\Information\*"
    Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse
}

答案 1 :(得分:3)

Import-csv使用文件的第一行作为标题,因此它使用D113978作为标题名称而不是项目。

我假设您的csv仅包含计算机名称:

D113978
Y118834
D978113
Y842118

如果是的话,它实际上不是一个csv(因为它没有标题),而是一个基于文本的列表。

在这种情况下,我将仅使用Get-Content,它将仅使用文件中的每一行作为项目。

然后将$AutoPaths = [..]移动到foreach内,以便每次循环更新它:

$computers = Get-Content "C:\DTS\BMC\AutoCAD - ANY VERSION_Members.csv"

foreach ($system in $computers){
    $AutoPaths = "\\$system\C$\DTS\BMC\Autodesk Audit\Information\*"
    Copy-Item $AutoPaths -Destination "C:\DTS\BMC\Audit Results" -Force -Recurse
}