Исключить все подкаталоги из PowerShell Get-ChildItem -match - PullRequest
0 голосов
/ 20 ноября 2018

Цель

Исключить все подкаталоги при запуске сценария 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 голосов
/ 20 ноября 2018

Как указал Оуайн и gvee в комментариях, при использовании ключа -Recurse вы сообщаете командлету Get-ChildItem, что вы хотите пройти через структуру подкаталогов из выбранного местоположения. Как указано на сайте документации командлета

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
    )}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...