我有一个带有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中具有第三项,等等。
因此该脚本似乎在查看每个系统名称,但根本没有用系统名称来完成我想要的工作。
有人可以指出我的缺点吗?
答案 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
}