我有一个庞大的目录(几千个文件夹),如下所示:
...\94000\abc\def\hig
...\95000\abc\def\hig
...\96000\abc\def\hig
...\97000\abc\def\hig
...
因此,路径的一部分交替,但文件夹结构的其余部分是相同的。在abc和def等下也有很多子文件夹
我需要做的是复制一个特定的文件,比如文件夹“hig”。
我对Powershell很陌生,但设法将以下内容整合在一起:
$destination = "C:\Users\etc..."
$source = "B:\94000"
Get-ChildItem $source -Filter "LIVE*.docx" -File -Recurse | Foreach {
Copy-Item $_.FullName $destination
}
我知道这是非常基本但它确实有效。问题是它很慢,给文件夹的数量进行筛选。
有什么方法可以加快速度吗?我想让脚本跳过我知道不包含我需要的文件的文件夹。
我还想知道我是否可以在路径中使用通配符,以便我可以定义确切的文件夹,如下所示: \ 9 * 000abc \ DEF \ HIG
但无法做任何工作。
非常感谢任何想法!
答案 0 :(得分:2)
你绝对可以使用像你暗示的通配符。你可以这样做:
Get-ChildItem B:\9*000\abc\def\hig\live*.docx
那应该返回如下文件:
B:\ 94000 \ ABC \ DEF \ HIG \ livesite.docx
B:\ 94000 \ ABC \ DEF \ HIG \ live.docx
B:\ 95000 \ ABC \ DEF \ HIG \ livefreeordie.docx
B:\ 96000 \ ABC \ DEF \ HIG \ liverandonions.docx
B:\ 96000 \ abc \ def \ hig \ livesinmomsbasement.docx
然后您可以将这些内容传递给Copy-Item -Destination $destination
,如:
Get-ChildItem B:\9*000\abc\def\hig\live*.docx | Copy-Item -Destination $destination
答案 1 :(得分:0)
使用Get-ChildItem
,您可以使用带有字符串的-Exclude
来跳过文件夹/文件。这可能会加快速度。此外,如果您使用Powershell 2.0 Get-ChildItem
非常慢。升级到Powershell 3.0或更高版本将使其更快。
答案 2 :(得分:0)
默认情况下支持路径中的通配符。同样,您的过滤器是解析文件的最快方法(与Where-Object
之类的东西相比)。您的ForEach-Object
电话实际上可能会减慢速度。另一个答案是在这方面加快速度是正确的,因为它可以在不添加另一个迭代步骤的情况下接受管道输入。
$destination = 'C:\Users\etc\'
$source = 'B:\94*00'
Get-ChildItem -Path $source -Filter "LIVE*.docx" -File -Recurse |
Copy-Item -Destination $destination