复制整个文件夹结构,但通过两个不同的字符串根据文件夹名称过滤子文件夹?

Copy the entire folder structure but filter subfolders based on the folder name by two different strings?

如何复制整个文件夹结构,但只复制 select 一些基于文件夹名称的(子)文件夹?

我试过了

PS C:\Users> $includes = "*Touch*", "*mpr*"

PS C:\Users Get-ChildItem "C:\Users\Desktop\mro" -Directory |
>>     Where-Object{$_.Name -in $includes} |
>>     Copy-Item -Destination "C:\Users\shizzle\Desktop\shi_data6" -Recurse -Force


这会保留文件夹结构,但会复制整个文件夹结构(不是 select 由包含字符串“Touch”或“ 的文件夹编辑mpr".

Get-ChildItem -Path 'C:\Users\Desktop\mro' | Copy-Item -Destination 'C:\Users\Desktop\shi_data9' -Recurse -Container -Filter "*Touch*"

不起作用,因为它专门通过“Touch”复制文件夹和内容,并忽略所有其他文件(不包含“Touch” “)在所需的文件夹中,两个过滤器似乎也不起作用(更不用说与布尔值结合使用了(如“Touch”或“mpr” ))

您正在使用 -in 运算符测试名称是否与 $includes 数组中的完全匹配,但该数组包含通配符,因此将不起作用。

而是使用正则表达式 -match 运算符并将 $includes 变量设置为一个字符串,其中部分名称由正则表达式 OR (|) 字符分隔:

$includes = 'Touch|mpr'
Get-ChildItem "C:\Users\Desktop\shizzle\mro" -Directory |
    Where-Object{$_.Name -match $includes} |
    Copy-Item -Destination "C:\Users\shizzle\Desktop\shi_data6" -Recurse -Force

根据您的评论,通配符比较与正则表达式比较不同。

  • 在通配符比较中(与运算符 -likenotlike 一起使用)星号 * 表示 零或任意数量的任意字符 .
  • 在 Regex 中,相同的字符具有不同的含义:前一个字符或字符组的零个或多个 (请参阅 table下面)
  • 像您尝试使用运算符 -in 那样比较文字文本以在数组中查找匹配的字符串不使用通配符或正则表达式;该字符串要么按字面意思找到,要么不按字面意义找到。

至于代码,我已经对此进行了测试(当然使用不同的文件路径)并且有效,提供副本目标文件夹已经存在。
如果不是这种情况,请使用

开始代码
if (!(Test-Path -Path "C:\Users\shizzle\Desktop\shi_data6" -PathType Container)) {
    $null = New-Item -Path "C:\Users\shizzle\Desktop\shi_data6" -ItemType Directory
}

确保先创建它。

这是我的测试结果

源文件夹:

D:\TEST
+---DoNotCopyThisFolder
|   +---SubFolder_1
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   \---SubFolder_2
|           File_1.txt
|           File_2.txt
|           File_3.txt
|
+---mpr_Files
|   +---SubFolder_1
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   +---SubFolder_2
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   \---SubFolder_3
|           File_1.txt
|           File_2.txt
|           File_3.txt
|
+---NotThisOne
|   +---SubFolder_1
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   +---SubFolder_2
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   \---SubFolder_3
|           File_1.txt
|           File_2.txt
|           File_3.txt
|
\---Touch
    +---SubFolder_1
    |       File_1.txt
    |       File_2.txt
    |       File_3.txt
    |
    +---SubFolder_2
    |       File_1.txt
    |       File_2.txt
    |       File_3.txt
    |
    \---SubFolder_3
            File_1.txt
            File_2.txt
            File_3.txt

目标文件夹:

D:\SHI_DATA6
+---mpr_Files
|   +---SubFolder_1
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   +---SubFolder_2
|   |       File_1.txt
|   |       File_2.txt
|   |       File_3.txt
|   |
|   \---SubFolder_3
|           File_1.txt
|           File_2.txt
|           File_3.txt
|
\---Touch
    +---SubFolder_1
    |       File_1.txt
    |       File_2.txt
    |       File_3.txt
    |
    +---SubFolder_2
    |       File_1.txt
    |       File_2.txt
    |       File_3.txt
    |
    \---SubFolder_3
            File_1.txt
            File_2.txt
            File_3.txt

对于正则表达式,有几个特殊字符具有特殊含义:

正则表达式中的特殊字符

Char Description Meaning
\ Backslash Used to escape a special character
^ Caret Beginning of a string
$ Dollar sign End of a string
. Period or dot Matches any single character
| Vertical bar or pipe symbol Matches previous OR next character/group
? Question mark Match zero or one of the previous
* Asterisk or star Match zero, one or more of the previous
+ Plus sign Match one or more of the previous
( ) Opening and closing parenthesis Group characters
[ ] Opening and closing square bracket Matches a range of characters
{ } Opening and closing curly brace Matches a specified number of occurrences of the previous