2017-07-31 49 views
3

我有一个巨大的目录(几千个文件夹),就像这样:PowerShell的 - 从字符串文件夹除外

...\94000\abc\def\hig 
...\95000\abc\def\hig 
...\96000\abc\def\hig 
...\97000\abc\def\hig 
... 

于是就有了路径交替,但该文件夹结构的其余部分的一个部分是相同的。还有很多子文件夹下abc和def等

我需要做的是复制一个特定的文件,让我们说文件夹“高”。

我很新的PowerShell的,但设法整理出以下:

$destination = "C:\Users\etc..." 
    $source = "B:\94000" 
    Get-ChildItem $source -Filter "LIVE*.docx" -File -Recurse | Foreach { 
      Copy-Item $_.FullName $destination 
    } 

我知道这是很基本的,但它的实际工作。问题是,它很慢,给文件夹筛选的数量。

有什么办法可以加速事情吗?我正在考虑让脚本跳过我知道不包含我需要的文件的文件夹。

我也想知道如果我可以使用通配符的路径,所以我可以定义确切的文件夹,例如: \ 9 * 000abc \高清\ HIG

但不能让任何工作。

任何想法非常感谢!

回答

0

随着Get-ChildItem你可以使用-Exclude一个字符串来跳过使用的文件夹/文件。这可能会加快速度。此外,如果您使用PowerShell 2.0 Get-ChildItem是非常缓慢的。升级到Powershell 3.0或更高版本将使其更快。

2

你绝对可以使用你暗示的通配符。你可以这样做:

Get-ChildItem B:\9*000\abc\def\hig\live*.docx 

应该返回的文件,如:

B:\ 94000 \ ABC \ DEF \ HIG \ livesite.docx
B:\ 94000 \ ABC \ DEF \ HIG \直播.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 like:

Get-ChildItem B:\9*000\abc\def\hig\live*.docx | Copy-Item -Destination $destination 
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 
相关问题