Как исключить папки из каталога с помощью сценария power shell

#powershell #powershell-2.0 #powershell-3.0

#powershell #powershell-2.0 #powershell-3.0

Вопрос:

У меня есть каталог, который содержит несколько папок, я хотел исключить имена папок, которые содержат строку. Я попытался выполнить следующую команду, используя опцию подстановочных знаков (в переменной исключения), которая не работает в разделе исключения.

 $dirName = "C:UsersxyzDesktoppowershellScriptsdestmonitors" $excludes = "PortMonitor","ProcessMonitor","FileWatcher","UrlMonitor","*SQLMonitor*","LogMonitor" Get-ChildItem "C:UsersxyzDesktoppowershellScriptsmonitors*" -Directory | Where-Object{$_.Name -notin $excludes} | Copy-Item -Destination $dirName -Recurse -Force  

Пример:- Допустим, у меня есть папки в каталоге мониторов, такие как SQLMonitor , CSTK123_SQLMonitor, TEST_SQLMonitor, SQLMonitor_abc … теперь я хотел исключить эти папки с помощью подстановочных знаков

Как этого добиться в PowerShell.

Ответ №1:

 $dirName = "C:Userssj01856DesktoppowershellScriptsdestmonitors" $excludes = "PortMonitor","ProcessMonitor","FileWatcher","UrlMonitor","*SQLMonitor*","LogMonitor" Get-ChildItem "C:Userssj01856DesktoppowershellScriptsmonitors*" -Directory | Where-Object{$_.Name -notmatch ($excludes -join "|")} | Copy-Item -Destination $dirName -Recurse -Force  

Вам нужно сопоставить массив и не воспринимать звездочки буквально.

Комментарии:

1. При использовании регулярного -notmatch выражения вам нужно убрать звездочки вокруг *SQLMonitor* . Для имен директоров, которые следует понимать буквально, вам нужно вложить их в ^LiteralName$

Ответ №2:

Вы должны быть в состоянии сделать все это в рамках Get-ChildItem вызова с -Excludes параметром, который использует массив шаблонов для исключения:

 $dirName = "C:UsersxyzDesktoppowershellScriptsdestmonitors" $excludes = "PortMonitor","ProcessMonitor","FileWatcher","UrlMonitor","*SQLMonitor*","LogMonitor" Get-ChildItem "C:UsersxyzDesktoppowershellScriptsmonitors" -Directory -Exclude $excludes |   Copy-Item -Destination $dirName -Recurse -Force