我正在尝试自学足够的 powershell 或批处理编程来实现以下目标(我已经搜索并浏览了几个小时的 Youtube 教程,但无法将它们全部拼凑起来以弄清楚我需要什么- 例如,我没有得到 token ,但它们在 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%"
)
提前致谢!
最佳答案
顺便说一下,这个解决方案在 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)}
其中“edit-directory”是你的函数,它接受路径,并修改它以返回你的目标路径。此外,您也可以使用 robocopy 或 xcopy 代替 CopyTo,但 Copy-Item 是一个 powershell native ,不需要太多的字符串操作(根据我的经验,越少越好)。
编辑:这是一个可以解决问题的函数:
function edit-path{
Param([string] $path)
$modified_path = $dst_folder + "\"
$modified_path = $path.substring($src_folder.length)
return $modified_path
}
编辑:这是集成从 CSV 导入的方法,以便副本仅发生在 CSV 中写入的文件(我遗漏了,哎呀):
$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 或其他参数。
关于powershell - 从网络位置复制列表中定义的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316861/