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

标签 powershell for-loop cmd xcopy robocopy

我正在尝试自学足够的 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/

相关文章:

powershell 将新设置应用到任务栏

powershell - Azure 运行手册 : The subscription named 'xxx' cannot be found

windows - 命令脚本退出代码未被同一行 && 或 || 看到?

java - 从 cmd 运行 .class 文件

python - 在Python中使用 `for`循环语句解压序列结构

batch-file - CMD:根据文件夹名称的前 8 个字符批量重命名文件夹中文件的脚本

powershell - 将任何文件作为 powershell 脚本执行

javascript - 学习你 Node : #3 My First I/O

C for循环不会停止

c - 这个 for 循环的条件是做什么的?