如何从CSV列表中选择[n]个项目以将它们分配给变量,然后删除这些项目并使用Poweshell保存文件

问题描述

我正在解析CSV文件,以获取需要复制到其他位置的文件夹的名称。因为有数百个,所以我需要选择前十个左右并运行复制例程,但是为了避免再次复制它们,我将其从列表中删除并保存文件。我将在每天的计划任务上运行此命令,以避免不得不等待文件夹完成复制。我在使用代码中的“选择”和“跳过”选项时遇到问题(请参见下文),如果我删除了这些行,则会复制文件夹(我正在使用空文件夹进行测试),但是如果我将它们放入其中,那么当我在Powershell中运行此程序时,什么也不会发生。在其他类似问题上,我环顾四周,但在选择和跳过CSV中的行时,找不到任何能解决该特定问题的答案。

$source_location = 'C:\Folders to copy'
$folders_Needed = gci $source_location
Set-Location -Path $source_location
$Dest = 'C:\Transferred Folders'
$csv_name = 'C:\List of Folders.csv'
$csv_Import = Get-Content $csv_name


foreach($csv_n in $csv_Import | Select-Object -First 3){
    foreach ($folder_Tocopy in $folders_Needed){        
        if("$folder_Tocopy" -contains "$csv_n"){        
        copy-Item -Path $folder_Tocopy -Destination $Dest -Recurse -Verbose        
        }
    }
    $csv_Import | Select-Object -Skip 3 | Out-File -FilePath $csv_name
}

解决方法

它应该与示例中的skip / first一起使用,但是如果没有您的示例数据,我将无法真正对其进行测试。另外,在循环的每次迭代中将相同的输出写入csv文件似乎是错误的。我认为这不是一个csv文件,实际上只是一个纯文本文件,一个文件夹列表?只是文件夹名称还是完整路径? (我假设是第一个。)

无论如何,这是我建议的脚本更新(请参见注释):

$source_location = 'C:\Folders to Copy'
$folders_Needed = Get-ChildItem $source_location
$Dest = 'C:\Transferred Folders'
$csv_name = 'C:\List of Folders.csv'
$csv_Import = @(Get-Content $csv_name)
# optional limit
# set this to $csv_Import.Count if you want to copy all folders
$limit = 10

# loop over the csv entries
for ($i = 0; $i -lt $csv_Import.Count -and $i -lt $limit; $i++) {
    # current line in the csv file
    $csv_n = $csv_Import[$i]
    # copy the folder(s) which name matches the csv entry
    $folders_Needed | where {$_.Name -eq $csv_n} | Copy-Item -Destination $Dest -Recurse -Verbose
    # update the csv file (skip all processed entries)
    $csv_Import | Select-Object -Skip ($i + 1) | Out-File -FilePath $csv_name
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...