我试图自学足够的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%"
)
提前致谢!
答案 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
}
我对字符串操作不是很好,所以字符串位有点令人困惑,但是这里的所有内容都拼写出来了。