Powershell - 从字符串

时间:2017-07-31 16:34:36

标签: powershell

我有一个庞大的目录(几千个文件夹),如下所示:

...\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

但无法做任何工作。

非常感谢任何想法!

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 \ 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