1

$基本的に私がやろうとしていることは:

必要なファイルのリストを含む.csvスプレッドシートから情報を取得しています。問題は、それらが存在するディレクトリに16,000以上のファイルが含まれていることです。必要なのは約4600個だけです(スプレッドシートの列にはその数しか含まれていないため)。私は実際にコードのその部分をすべて理解しました...しかし、問題が発生しているのは、コードの「Copy-Item」部分に到達したときです。ファイル名の一部として角かっこが含まれているファイルにヒットするまでは正常に実行されるため、もちろんエラーがスローされ、必要なものが得られません。どうすればこれを修正できますか?念のために言っておきますが、コピーが必要な/コピーされるファイルの名前は変更できません。それが解決策である場合、ここで「-LiteralPath」を使用する方法がわかりません。:(これが私のコードです:

$Directory = gci D:\Documents\15075_32\
$Destination = "D:\CleanReview"
$ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv'
$BaseItem = foreach($li in $ReviewSheet){$li.Base}
foreach($File in $Directory){
    $File.BaseName
foreach($Item in $BaseItem){
    if($Item -like $File.BaseName){
        $Item
            Copy-Item $File.FullName $Destination -Force
}
}
}
4

2 に答える 2

1

ファイルを再試行する機能を使用して一括コピーを実行する場合は、robocopy代わりに使用することを検討します。それでもCopy-Itemを使用する場合-LiteralPathは、ソースパスのパラメーターを使用します。

于 2013-01-11T20:54:55.807 に答える
0

わかりました...Googleで多くの調査を行った後、PSのV3で修正を加えても、-LiteralPath演算子を使用しても、コピー内のワイルドカードを使用してファイル名を解釈していることがわかりました。多くの試行錯誤の結果、IFステートメント内の演算子がこれを引き起こしていることがわかりました。-LiteralPathが使用されている場合でも、それはIFステートメント内にあり、基準がtrueの場合は忘れられます。したがって、これに対抗し、ワイルドカードを解釈せずにファイル名を読み取らせるには、-eqがワイルドカードをサポートしていないため、-likeを-eqに切り替える必要がありました。私がこれに遭遇した次の問題は、PSがCドライブを探していたときにファイルが見つからなかったと報告し続けたことでした!私が ディレクトリを宣言しました。コピーコマンド内で宣言を省略して使用した後でも!PSはこれに対して非常に気まぐれであるように思われ、その結果、スクリプトに対して文字通り完全に綴ることが、必要な結果を達成するものであることがわかりました。したがって、確認するために、csvを取得し、列の1つを読み取っています。これは、その列が拡張子のないファイル名のリストであるためです。そのリストをディレクトリリストと比較していて、名前の列リストがディレクトリ内のベース名と一致する場合...それらのディレクトリファイルをDドライブの別のフォルダにコピーするために必要でした。これが私の作業コードです!キースヒル(上記)のおかげで、私はそれを少し違った見方で始めました!ご協力いただきありがとうございます!その結果、スクリプトに対して文字通り完全に綴ることが、必要な結果を達成するものであることがわかりました。したがって、確認するために、csvを取得し、列の1つを読み取っています。これは、その列が拡張子のないファイル名のリストであるためです。そのリストをディレクトリリストと比較していて、名前の列リストがディレクトリ内のベース名と一致する場合...それらのディレクトリファイルをDドライブの別のフォルダにコピーするために必要でした。これが私の作業コードです!キースヒル(上記)のおかげで、私はそれを少し違った見方で始めました!ご協力いただきありがとうございます!その結果、スクリプトに対して文字通り完全に綴ることが、必要な結果を達成するものであることがわかりました。したがって、確認するために、csvを取得し、列の1つを読み取っています。これは、その列が拡張子のないファイル名のリストであるためです。そのリストをディレクトリリストと比較していて、名前の列リストがディレクトリ内のベース名と一致する場合...それらのディレクトリファイルをDドライブの別のフォルダにコピーするために必要でした。これが私の作業コードです!キースヒル(上記)のおかげで、私はそれを少し違った見方で始めました!ご協力いただきありがとうございます!名前の列リストがディレクトリ内のベース名と一致する場合...これらのディレクトリファイルをDドライブ上の別のフォルダにコピーするために必要でした。これが私の作業コードです!キースヒル(上記)のおかげで、私はそれを少し違った見方で始めました!ご協力いただきありがとうございます!名前の列リストがディレクトリ内のベース名と一致する場合...これらのディレクトリファイルをDドライブ上の別のフォルダにコピーするために必要でした。これが私の作業コードです!キースヒル(上記)のおかげで、私はそれを少し違った見方で始めました!ご協力いただきありがとうございます!

$Directory = gci -LiteralPath D:\Documents\15075_32\
$Destination = "D:\CleanReview\"
$ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv'
$BaseItem = foreach($li in $ReviewSheet){$li.Base}
foreach($File in $Directory){
foreach($Item in $BaseItem){
    if($Item -eq $File.BaseName){
        $Item
            Copy-Item -LiteralPath D:\Documents\15075_32\$File -Destination $Destination -Force
}
}
}
于 2013-01-14T14:51:06.183 に答える