复制整个文件夹结构,但通过两个不同的字符串根据文件夹名称过滤子文件夹?
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
根据您的评论,通配符比较与正则表达式比较不同。
- 在通配符比较中(与运算符
-like
和 notlike
一起使用)星号 *
表示 零或任意数量的任意字符 .
- 在 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
如何复制整个文件夹结构,但只复制 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
根据您的评论,通配符比较与正则表达式比较不同。
- 在通配符比较中(与运算符
-like
和notlike
一起使用)星号*
表示 零或任意数量的任意字符 . - 在 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 |