测试于PowerShell 5.1

dir -Path

dir -Path 档名、资料夹名

dir -Path 档名 → 档案dir -Path 资料夹名 → 进入资料夹之后,列出里面的东西(全部)

档名、资料夹名的差别

  • 寻找的范围
  • 寻找的目标

如果要列出资料夹本身,使用Get-Item -Path 资料夹名

-Recurse 在各层寻找dir -Path 档名 -Recurse → 各层符合档名的档案、资料夹dir -Path 资料夹名 -Recurse → 进入资料夹之后,列出每层的东西(全部)

dir -Path 不存在的名称

dir -Path 不存在的名称 → 报错dir -Path 不存在的名称 -Recurse → 虽然第一层没有,但是,可能在别层找到。如果最后没有找到,不会报错


dir -Path 万用字元 -Recurse

dir -Path A* -Recurse

第一层的A*都是资料夹   进入资料夹之后,列出每层的东西(全部)。

第一层的A*有找到档案 or 没有找到东西(不存在)   列出各层符合A*的档案、资料夹

# 这三行很像
dir 新资料夹1 -Recurse
dir 新资料夹2 -Recurse
dir 新资料夹3 -Recurse

# 可以改写成
dir 新资料夹* -Recurse
dir 新资料夹[1-3] -Recurse
#前提是:万用字元的结果,只有资料夹

dir -Path 万用字元 -Recurse -File

dir -Path A* -Recurse -File

第一层的A*都是资料夹   进不去A*资料夹,没有反应

   以下两行,可以进入资料夹,列出各层的档案   dir -Path A1资料夹 -Recurse -File   dir -Recurse -File

第一层的A*有找到档案 or 没有找到东西(不存在)   列出各层符合A*的档案,不列资料夹

dir -Path 万用字元1 -Recurse -Include 万用字元2

-Path 万用字元1:寻找的范围-Include 万用字元2:寻找的目标

dir -Path A* -Recurse -Include *.txt

第一层A*的档案:如果符合*.txt就列出第一层A*的资料夹:进入资料夹之后,每层符合*.txt的东西   子资料夹名不符合*.txt,不会列出。但是,仍然会进入资料夹里寻找。

dir -Path 万用字元1 -Recurse -Include 万用字元2 -File

-Path 万用字元1:寻找的范围-Include 万用字元2:寻找的目标-File:过滤范围和目标

dir -Path A* -Recurse -Include *.txt -File

第一层A*的档案:如果符合*.txt就列出第一层A*的资料夹:因为-File的关系,不会进入资料夹寻找

dir -Recurse -Include *.txt -File

没有指定-Path:寻找的范围工作目录-Include *.txt:寻找的目标*.txt-File:进入工作目录,寻找各层的档案

dir -Path 万用字元1 -Recurse -Exclude 万用字元2

先做完dir -Path 万用字元1 -Recurse再去排除万用字元2

dir -Path -Include (没有使用-Recurse)

dir -Path 资料夹名 -Include 万用字元

-Path 资料夹名:寻找的范围-Include 万用字元:检查范围、内容物

# 没有反应。因为「新资料夹」名称不符合 *.txt
dir -Path 新资料夹 -Include *.txt

# 进入A1(名称符合A*)
# 检查内容物、只列出内容物
dir -Path A1资料夹 -Include A*

# 多了-Recurse参数,不检查资料夹名
dir -Path 新资料夹 -Include *.txt -Recurse

dir -Path 资料夹名 -Include 万用字元 -File

-Path 资料夹名:寻找的范围-Include 万用字元:检查范围、内容物-File:检查范围、内容物

# 使用-File参数,不会进入资料夹
dir -Path A1资料夹 -Include A* -File

# -Recurse -File,仍然进入资料夹
dir -Path A1资料夹 -Recurse -Include A* -File

dir -Path 万用字元1 -Include 万用字元2

-Path 万用字元1:寻找的范围-Include 万用字元2:检查范围、内容物

dir -Path C:\\Pic\\* -Include A*

# 结果
# C:\\Pic\\A.txt
# C:\\Pic\\A1\\A11.txt
# 找到C:\\Pic\\A1资料夹,不列出资料夹,而是进去寻找

dir -Path 万用字元1 -Include 万用字元2 -File

-Path 万用字元1:寻找的范围-Include 万用字元2:检查范围、内容物-File:检查范围、内容物

# 只找档案
# 如果*代表资料夹,不会进去寻找
dir -Path C:\\Pic\\* -Include A* -File

dir -Include 万用字元

# 没有指定-Path参数,-Include参数检查工作目录
# 如果工作目录是「根目录」,没有反应
dir -Include *.txt

dir -Include 万用字元 -File

# 没反应
# 因为-File参数,不会进入工作目录寻找
dir -Include *.txt -File


万用字元

3种万用字元

万用字元
意义
* 0个or1个or多个字
? 1个字
[abc] a、b、c其中1个字,可以写成[a-c]

PS E:\\> (dir A*.txt).Name
A.txt
A1.txt
A11.txt
A111.txt

PS E:\\> (dir A?.txt).Name
A1.txt

-Filter 2种万用字元

万用字元
意义
* 0个or1个or多个字
? 0个or1个字

PS E:\\> (dir -filter A*.txt).Name
A.txt
A1.txt
A11.txt
A111.txt

PS E:\\> (dir -filter A?.txt).Name
A.txt
A1.txt

万用字元 []

PS E:\\> (dir ?.txt).Name
A.txt
B.txt
C.txt

# 不区大小写
PS E:\\> (dir [ab].txt).Name
A.txt
B.txt

字面值 []

使用 -Literal参数,使[]成为普通的字

PS E:\\> (dir -Literal [2022]001.txt).Name
[2022]001.txt

字面值 [] 和万用字元 *

想要列出以下档案

[2022]001.txt[2023]001.txt[2024]001.txt

# 使用 -Literal参数,报错
PS E:\\> (dir -Literal [*]001.txt).Name
dir : 找不到 \'E:\\[*]001.txt\' 路径,因为它不存在。

# 使用万用字元
# [[] 表示普通的 [
# *
# []] 表示普通的 ]
PS E:\\> (dir [[]*[]]001.txt).Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

使用跳脱字元,使万用字元变成普通的字

跳脱字元:位于键盘左上角、Esc的下面

-Path参数值跳脱万用字元

引号的种类
跳脱字元的数量
单引号 2
双引号 4
没有使用引号 4

# 单引号:2个`
PS E:\\> (dir -Path \'``[*``]001.txt\').Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

# 双引号:4个`
PS E:\\> (dir -Path "````[*````]001.txt").Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

# 没有使用引号:4个`
PS E:\\> (dir -Path ````[*````]001.txt).Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

-Include参数值、-like运算子跳脱万用字元

引号的种类
跳脱字元的数量
单引号 1
双引号 2
没有使用引号 2

# 单引号:1个`
PS E:\\> (dir -Path * -Include \'`[*`]001.txt\').Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

# 双引号:2个`
PS E:\\> (dir -Path * -Include "``[*``]001.txt").Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

# 没有使用引号:2个`
PS E:\\> (dir -Path * -Include ``[*``]001.txt).Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

# 单引号:1个`
PS E:\\> \'[2022]001.txt\' -like \'`[*`]001.txt\'
True

# 双引号:2个`
PS E:\\> \'[2022]001.txt\' -like "``[*``]001.txt"
True

-Filter参数值不用跳脱万用字元

PS E:\\> (dir -Filter [*]001.txt).Name
[2022]001.txt
[2023]001.txt
[2024]001.txt

-Filter参数值在FAT32磁盘机使用万用字元

# 列出别的档案了
PS E:\\> (dir -Filter *.txt).Name
B.txt
B.txt1
B.txt12
B.txt123

# 使用-Path参数,正常
PS E:\\> (dir *.txt).Name
B.txt

使用万用字元的注意事项

找不到东西的时候:没有反应、不会报错

  • 没有符合的东西
  • 有符合的东西。因为万用字元没有写好。所以找不到东西。

  • 参考资料

    • Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell | Microsoft Learn

    • powershell - Copy file with square brackets [ ] in the filename and use * wildcard - Stack Overflow