2017-07-26 53 views
2

我试图教自己足够的PowerShell或批处理编程,想要实现以下目标(我已经搜索并浏览了几个小时的Youtube教程,但可以' t完全把它拼凑在一起,找出我需要的东西 - 例如,我没有获得令牌,但它们在For循环中似乎是必需的)。另外,不确定下面是否最好通过robocopy或xcopy来实现。从网络位置复制列表中定义的文件

任务:

定义文件的列表以CSV检索(文件名称将被列为13位号码,分机将是未知的,但通常是.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

顺便说一句,这个解决方案在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文件(这是我刚走出去,哎呀呀):

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

请注意,你必须把整个CSV路径在$ CSV_path变量,取决于如何该文件的内容写入,您可能需要使用$ _。全名或其他参数。

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 
    } 

我不是伟大的字符串操作,因此串位是有点混乱,但这里的一切都列明。