从PowerShell Get-ChildItem -match

时间:2018-11-20 05:38:23

标签: powershell

目标

运行与文件名正则表达式模式匹配的PowerShell脚本时,请排除所有子目录

目录结构

/
- 2018-11-19.md

18-2/
- 2018-10-16.md
- 2019-01-14.md
- 2019-10-10.md

18-3/
- 2019-01-13.md
- 2019-04-25.md

PowerShell脚本

$file = '2018-11-19.md'

Get-ChildItem -recurse | where-object { $_.FullName -match '[0-9]{4}-[0-9]{2}-[0-9]{2}.md' } | 
    ForEach-Object {$fullname = $_.fullname; (Get-Content $_.fullname | foreach-object {
        $_ -replace "apple", "orange"
    }) | Set-Content $fullname}

(Get-Content $file | ForEach-Object {
        $_ -replace '<p(.*?)>(.*?)</p>', '$2'
    }) | Set-Content -Encoding Utf8 $file

Get-ChildItem -recurse | where-object { $_.FullName -match '[0-9]{4}-[0-9]{2}-[0-9]{2}.md' } | 
    foreach-Object {$fullname2 = $_.fullname; (Get-Content $_.fullname | 
         pandoc -f markdown -t markdown -o $fullname2 $fullname2
    )}

详细信息

  • 目标是仅在根目录中的文件上运行PowerShell脚本。根目录下的这些文件将更改,但始终根据所示约定进行命名。 PowerShell脚本中的正则表达式成功匹配了该文件名。
  • 当前,脚本会更改上面目录示例中的所有文件
  • 我能找到的任何示例都显示了如何通过在脚本中标识特定目录的名称来排除特定目录(例如-Exclude folder-name)。我想排除所有子目录而不用特别命名,因为...
  • ......将来可能会为18-4、19-5等添加子目录,因此基于正则表达式的排除似乎很有意义。

尝试

为了将脚本的作用域限制为根目录,我尝试在-notmatch上使用\\*\*.*\\*等进行变体,没有成功。

要排除子目录,我在-Exclude上尝试了具有相同路径的变体,但没有成功。

我的PowerShell知识不够先进,无法进一步发展。我将不胜感激,希望为您提供任何帮助或指出正确的方向。谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

正如Owain和gvee在评论中指出的那样,当使用-Recurse开关时,您告诉Get-ChildItem cmdlet您希望从所选位置遍历子目录结构。 As expained on the docs site of the cmdlet

Gets the items in the specified locations and in all child items of the locations.

因此,只需删除开关,即可使代码按您的意愿执行。 如果只需要X级子目录,则可以使用-Depth开关。

Get-ChildItem | where-object { $_.FullName -match '[0-9]{4}-[0-9]{2}-[0-9]{2}.md' } | 
    ForEach-Object {$fullname = $_.fullname; (Get-Content $_.fullname | foreach-object {
        $_ -replace "apple", "orange"
    }) | Set-Content $fullname}

(Get-Content $file | ForEach-Object {
        $_ -replace '<p(.*?)>(.*?)</p>', '$2'
    }) | Set-Content -Encoding Utf8 $file

Get-ChildItem | where-object { $_.FullName -match '[0-9]{4}-[0-9]{2}-[0-9]{2}.md' } | 
    foreach-Object {$fullname2 = $_.fullname; (Get-Content $_.fullname | 
         pandoc -f markdown -t markdown -o $fullname2 $fullname2
    )}