如何仅从 csv 文件中获取所选元素的值,但从不同的列中获取?

How do I get from a csv file only the value of the selected element, but from a different column?

我有这个 csv 文件示例:

NAME PATH
file 1 C:\path1
file 2 C:\path2
file 3 C:\path3

我还有一个包含文件的原始文件夹。这里的想法是查看 CSV 文件中的文件是否存在于文件夹中以及 csv 文件中定义的目标路径中。如果它们不存在,则无事可做。如果它们存在,脚本需要将它们复制到 csv 文件的值 PATH 中定义的路径中。所以它基本上会重写现有文件。

我真的希望问题的定义很清楚。到目前为止我所拥有的是:

$filesInfo = @(Import-Csv C:\files.csv)
$files = $filesInfo.NAME
$paths = $filesInfo.PATH

foreach ($file in $files){
    $isThereOrigin = Test-Path -Path "C:\folder$file"
    if ($isThereOrigin){
        foreach ($path in $paths) {
            $isThereDestination = Test-Path -Path "$path$file"
            if ($isThereDestination){
                    Copy-Item -Path "C:\folder$file" -Destination $path
            }
        }
    }
}

所以,基本上,我试图用这段代码做的是,首先我尝试查看该文件是否存在于原始文件夹中。如果那里有文件,我会查看是否有目标(因为目标文件可能不存在)。如果两个条件都为真,则复制文件。这工作正常。

但是,有时此代码不起作用。假设 file2 包含在 path1path2 中。使用我现在拥有的代码,file2 将被复制到 path1path2 中,我不希望这样。我希望 file2 在 csv 文件中定义的路径中仅被复制

我希望一切都清楚。谢谢!

你的错误在于将 row-like 个对象的原始数组拼接成两个单独的数组:

$files = $filesInfo.NAME
$paths = $filesInfo.PATH

相反,遍历原始 $filesInfo 数组:

foreach ($fileInfo in $filesInfo){
    $fileName = $fileInfo.NAME
    $isThereOrigin = Test-Path -LiteralPath "C:\folder$fileName"
    if($isThereOrigin){
        $path = $fileInfo.PATH
        $isThereDestination = Test-Path -LiteralPath "$path$fileName"
        if($isThereDestination){
            Copy-Item -LiteralPath "C:\folder$fileName" -Destination $path -Force
        }
    }
}