2017-12-10 13 views
0

ちょっと私はPowerShellをかなり使い慣れていて、ムービー転送スクリプトを作成しようとしています。私はムービーフォルダの子アイテムをリストし、それらを.csvにダンプするスクリプトを作成しました。エンドユーザーは.csv内のファイルを選択し、別の列に「y」を配置することができます。次に、Powershellスクリプトを実行して、「y」列を使用して選択内容をフィルタリングし、項目を比較して別のフォルダ/ドライブにコピーします。Powershellはcsvのリストを使ってディレクトリをコピーします

ムービーが保存されている元のフォルダと.csvを比較し、別のフォルダにコピーするときに問題があります。私のスクリプトは、[0]などを使用して、一度に1つの配列項目を見つけてコピーします。

私の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 
} 
+0

'$ csv_name'は空です。あなたはそれに何も割り当てません。また、二重バックスラッシュでパスを作成します。 'Join-Path'を使うことで、間違いを避けることができます。そしてあなたはforeachを間違って使う。 – Swonkie

+0

ありがとうございました。申し訳ありませんが、変数を間違って書きました(ちょうど$ csvであることを意味していました) –

+0

Swonkieが指摘した訂正を反映するために質問を編集する必要があります。またあなたのforeach($ _)は私には非常に不明です。あなたは、しばしばパーセント記号で書かれた構成を試していますか? –

答えて

0

に再帰し、選択したすべてのフォルダをコピーしたいと思いますので、これは理想的ではありません。

$MoviesPath = "C:\Setup\Movies" 

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

デフォルトのものを使用しないため、デリミタにいくつか変更を加えました。私は$のTEMPNAMEに私はすべてのファイルをコピーすることができますが、それなしで、私は存在しないファイルのパス内の名前@ {} movienameにとして取得$のmovie.nameを置く場合

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

これは現時点での回避策として使用できます。私はより良い答えで戻ってきます。

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 

    } 
    } 
} 
関連する問題