从网络位置复制列表中定义的文件

时间:2017-07-26 03:18:54

标签: powershell for-loop cmd xcopy robocopy

我试图自学足够的PowerShell或批处理编程来实现以下目标(我已经进行了搜索并查看了几个小时的Youtube教程,但是不太可能一起来弄清楚我需要什么 - 例如,我没有获得令牌,但在For循环中它们似乎是必要的。此外,不确定是否最好通过robocopy或xcopy实现以下目的。

任务:

定义要在csv中检索的文件列表(文件名将列为13位数字,扩展名为UNKNOWN,但通常为.jpg但偶尔可能为.png - 可以通过通配符实现?)

列表会读取如下内容:

9780761189931
9780761189988
9781579657159

对于此文本文件中的每一行,请执行:

搜索网络文件夹和所有子文件夹

如果找到确切的文件名,请复制到任意目标(例如在桌面上创建的新文件夹)

(不是100%必要,但很高兴)For循环完成后,输出复制到新创建的目标文件夹中的文本文件中的文件列表

我认为我可能需要先做几件事,比如为源文件夹和目标文件夹定义变量?我在其他地方找到了以下内容,但是我无法理解它。

set src_folder=O:\2017\By_Month\Covers
set dst_folder=c:\Users\%USERNAME&\Desktop\GetCovers
for /f "tokens=*" %%i in (ISBN.txt) DO (
    xcopy /K "%src_folder%\%%i" "%dst_folder%"
)

提前致谢!

2 个答案:

答案 0 :(得分:0)

顺便提一下,这个解决方案在powershell中。

要获取文件夹的所有子文件,请使用Get-ChildItem和管道,然后您可以将名称与CSV的内部进行比较(顺便说一下,您可以使用import-CSV获取该名称)

Get-ChildItem -path $src_folder -recurse | foreach{$_.fullname}

我个人然后使用函数将名称编辑为字符串,但我知道这可能不是最好的方法。在管道之外创建一个函数,让它返回一个修改过的路径,这样你就可以继续上一行:

Get-ChildItem -path $src_folder -recurse | foreach{$_.CopyTo (edit-path $_.fullname)} 

在哪里"编辑目录"是您的函数,它接受路径,并修改它以返回您的目标路径。此外,您也可以使用robocopy或xcopy而不是CopyTo,但Copy-Item是PowerShell本机,并且不需要太多的字符串操作(根据我的经验,越少越好)。

编辑:这是一个可以解决问题的功能:

function edit-path{
Param([string] $path)
     $modified_path = $dst_folder + "\"
     $modified_path = $path.substring($src_folder.length)
     return $modified_path
}

编辑:这里是如何整合CSV导入,以便复制只发生在用CSV写的文件中(我遗漏了,oops):

$csv = import-csv $CSV_path
Get-ChildItem -path $src_folder -recurse | where-object{$csv -contains $_.name} | foreach{$_.CopyTo (edit-path $_.fullname)} 

请注意,您必须将整个CSV路径放在$ CSV_path变量中,并且根据写入该文件内容的方式,您可能必须使用$ _。fullname或其他参数。

答案 1 :(得分:0)

这似乎是一个平均问题:

$Arr = Import-CSV -Path $CSVPath

Get-ChildItem -Path $Folder -Recurse |
  Where-Object -FilterScript { $Arr -contains $PSItem.Name.Substring(0,($PSItem.Length - 4)) } |
  ForEach-Object -Process {
    Copy-Item -Destination $env:UserProfile\Desktop
    $PSItem.Name | Out-File -FilePath $env:UserProfile\Desktop\Results.txt -Append
  }

我对字符串操作不是很好,所以字符串位有点令人困惑,但是这里的所有内容都拼写出来了。