问题描述
我正在解析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
}