Powershell使用csv列表复制目录

时间:2017-12-10 00:37:12

标签: powershell csv get-childitem import-csv

嘿,我是PowerShell的新手,我正在尝试创建一个电影转移脚本。我创建了一个脚本,它将列出我的电影文件夹中的子项并将它们转储到.csv。然后,最终用户将能够选择.csv中的文件并在另一列中放置“y”。然后我将运行一个Powershell脚本,使用'y'列过滤掉他们的选择,并将items和copy-items比较到一个单独的文件夹/驱动器。

我在将.csv与保存电影的原始文件夹进行比较时遇到了一些问题,然后将它们复制到另一个文件夹。我的脚本只能使用[0]等一次查找和复制一个数组项。

以下是我的export-csv脚本(无问题)和我的副本项目脚本(有问题)的示例

导出-CSV.ps1

$Movies = "D:\Media\Movies"

Get-ChildItem $Movies | select name,y | Export-Csv D:\Media\Media_Scripts\Movies.csv -NoTypeInformation

输出.csv文件的图像

Movies.csv

COPY-ITEM.ps1 只有在$ csv_name之后在[]中添加单个数组编号时才有效。这并不理想,因为我想将所有选定的文件夹递归并复制到新位置

$Csv_loc = "D:\Media\Media_Scripts\"
$Movies_loc = "D:\Media\Movies\"
$Test = "D:\Media\Media_Scripts\Test\"

$csv = Import-Csv "$csv_loc\Movies.csv" | Where-Object{$_.y -eq "y"} | select name

$csv_name | foreach($_)
{ 
Get-ChildItem $movies_loc | Where-Object {$_.Name -contains $csv_name[0]} | copy-item -Destination $Test -Recurse -Verbose
}

2 个答案:

答案 0 :(得分:0)

我认为您似乎正在获取数组而无法解析要复制的名称。

$MoviesPath = "C:\Setup\Movies"

Get-ChildItem C:\setup\Movies | select Name, Available | Export-Csv C:\Setup\Movies.csv -Delimiter "|" -NoTypeInformation -Encoding UTF8

我对分隔符进行了一些更改,因为我没有使用默认分隔符。

$Csv_location = "C:\Setup\"
$Movies_location = "C:\Setup\Movies"
$DestinationPath = "C:\Setup\"

$Tempcsv = Import-Csv "C:\Setup\Movies.csv" -Delimiter "|" -Encoding UTF8 | Where-Object {$_.Available -eq "y"} | Select Name

foreach ($Movie in $Tempcsv) {
    $Tempname = $Movie.name
    Copy-Item -Path $Movies_location\$Tempname -Destination $DestinationPath -Recurse -Verbose }

如果我在$ tempname中输入$ movie.name,我可以复制所有文件,但如果没有这个名称,我会在文件路径中找到@ {moviename}作为名称。

目前,您可以将此作为解决方法。我会回答一个更好的答案。

答案 1 :(得分:0)

嘿,谢谢你的帮助。我为自己的问题不太清楚而道歉,感谢您抽出宝贵的时间来看看我。我通过一个外部来源获得了一些澄清,并且完成我想要实现的目标的脚本就是这个;

$movies_loc = gci "D:\Media\Movies" -Recurse
$Dest = "D:\Media\Media_Scripts\Test"

$csv_name = import-csv "D:\Media\Media_Scripts\Movies.csv" | ? {$_.y -eq "y"} | Select -ExpandProperty name

foreach($csv_n in $csv_name){

    foreach ($movie_loc in $movies_loc){

    if("$movie_loc" -contains "$csv_n"){

    Copy-Item -Path "D:\Media\Movies\$movie_loc" -Destination $Dest -Recurse -Verbose

    }
  }
}