【问题标题】:Powershell copy directories using a csv listing使用 csv 列表的 Powershell 复制目录
【发布时间】:2017-12-10 00:37:12
【问题描述】:

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

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

这是我的 export-csv 脚本(没有问题)和我的复制项脚本(有问题)的示例

EXPORT-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
}

【问题讨论】:

  • $csv_name 为空。你永远不会给它分配任何东西。您还可以创建带有双反斜杠的路径。使用Join-Path 可以避免此类错误。而且你用foreach错了。
  • 谢谢伙计,很抱歉我的变量写错了(本来应该是 $csv)
  • 您需要编辑您的问题以反映 Swonkie 指出的更正。你的 foreach($_) 对我来说也很不清楚。您是否正在尝试使用百分号编写的结构?

标签: powershell csv get-childitem import-csv


【解决方案1】:

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

$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} 作为名称。

您暂时可以将其用作解决方法。我会带着更好的答案回来。

【讨论】:

    【解决方案2】:

    嘿,谢谢你们的帮助。对于我的问题不太清楚,我深表歉意,感谢您花时间帮我看一下。我通过外部来源得到了一些澄清,完成我想要实现的目标的脚本是这样的;

    $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
    
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多