Регулярное выражение PowerShell для удаления папок, которые были извлечены windows исправлениями на root из C диска - PullRequest
1 голос
/ 25 января 2020

Требуется шаблон регулярного выражения PowerShell для удаления оставленных позади папок, извлеченных windows исправлениями с root диска C

c:\0260cbbd38dbbbea2543f8
c:\096ea4b36d877b65dc6c
c:\0cf52cad06ab7b5cfe2b4042c8
c:\0d90c7a3bdd67a5212aa527bc49b
c:\0e2180b528a8c152566816291c2252
c:\1050411ef7c0228177
c:\120dc98c3c427148e0e847
c:\1266b191a6041be04da921
c:\134f4bae5dcd171cba9d795c
c:\163037d9459286ec00226ecba86c6b
c:\19c5e16d96cff11fb276
c:\1a45ab7c977d005fa74016
c:\1ce14958a6b03c4fbdd0aa7595
c:\1d4dd4b97f3bc25610224b794970
c:\1e8dca560de070e9c7ce5ea666b1a2
c:\225f0c8c83d4680dcaf7f3
c:\27d0be422124c8e6895f55a2d92e6b45
c:\27e73ccf209a2d26b918bae979003e62
c:\2cbfba046b23288dda36b27681
c:\2d19c1e6f0c6d79a27f11258ed5a
c:\3368da3dec9eaf0c1bd2aa3e
c:\3572040545b171d83e9a8edbc517
c:\3651fe9fb1a4d98c8752b834c823fb
c:\37bc2d84450d0712ba434ab58b9be3b5
c:\397ede84503ab8705c61
c:\39b805b4909ca6ab7444
c:\3c3c48d33d8849a8738b547e9a
c:\3c4b849f11f1f97e739d91f23f
c:\406699ef4baa3836e6
c:\430dca3d98c1433dbb06c41b
c:\438f43589bf4d2e91de92257
c:\442b9d9e1f12d6527a355fbb94
c:\444fc210df5624fc57ed431b41
c:\4e80466bc0bd9a225a1d0c6c49eda3
c:\513f6e8fd2ec94ee80e1
c:\527c723b1c15e5ad1777f0
c:\52c8c81ce00ef83612bea8
c:\52cf084fe6416eac75251f
c:\53bcd710184608538ed626f9
c:\5555c66e2524b093ccde17168dc2
c:\576e7da4ab59dff0a4fc453bd09ce380
c:\58af12fd0051615253
c:\595108cb19dd9e45343e
c:\5c0519db74ebb86fa611ca76a2
c:\5c18f69a206888d586d0d6bfe1
c:\5dad9ce7201f38aca9fd6fbc63f3
c:\64cf5b2b98e7bfd45bf258b06e
c:\66a725a452271ff883431f2dd7b0f1
c:\68b4cee980651b3fbc
c:\718c43ef809499044a3c
c:\734073c2f7eda3b4c38a19e0
c:\737a421b02032d614a7a1c45
c:\74edd213e1fe718df94032a51d
c:\781f57f5ac41af00be
c:\7af4485cc5429456445957
c:\7d2d566780048cba452b03c6b263
c:\7fe3e7297a62e48255533539033ee50c
c:\8228bc4c03fd5b2f1ebb24
c:\83ad2f96485c40340a2cd782
c:\88a6f42b17c78a0638
c:\88fd60c16b19a0cf73
c:\8a588e86a91e3ca897f542
c:\8acdfcd173abff9029beb5
c:\8b9e7e1b322c408d340970f0
c:\8ff8bb90108d7627eb1267d09ba0fb55
c:\90b7703a90a2c24c7b
c:\93d276f9dc924a406a6ed01b
c:\9c7ef323ec48ed5587661b4693
c:\a1eb22f89d6a07c904db
c:\a47813cc369c82be7143f47185
c:\a49ce62ce9ce98096931d23c51
c:\a61924dfd4704703d5e39c5281d29e
c:\a63849d1d3bbd85790ee4a01299bd6
c:\a753ff49744ccadded681251d331d35f
c:\ad975367f3e001f51a14c9908b23
c:\b0face991a3ad869ca
c:\b82598682fc78f9305
c:\ba8a744c5b959384186bc4
c:\babdd0ba0a07d3c9223cef
c:\bc0b82ac0babb98b8342350bc8
c:\bdc2d2f2f3bc01003a91fe0e1459
c:\c0fae0409a0b10ea75
c:\c1180e96da82fae50747
c:\c4f0fd540da02906b56741b3c9
c:\ca7f59e621d33ce834ba0d
c:\cd19f0d28269630b2a63986edd91
c:\d486081e034c03d07b7fdc7d25
c:\d4f6b9fd6bf99442f9ccf0dae3
c:\d557a9f6fa2474f0d1622c381b03
c:\d571c66922d2adca2707b43c4d91
c:\d628ab789f80774608696b5ab49702
c:\d78bc5349052849aaca6eea917eb6f97
c:\db7cbb79e4cec11e0750e59c
c:\db7d5b6b5ea0efe9b7bcf9cf
c:\de2be517ad36995b3045c5288bd68f
c:\e0a72cd7cc448809cb
c:\e196772ec200ace6dcbd
c:\ea3a0fea3bdf080ee65b60
c:\ec1b70f46f6fe0088a451a1662
c:\f04ab325c03a1380ca
c:\f3f4d3bf0fb6fdc477c13c99
c:\f43507f18e2024ffdb8ad2b189
c:\f54ce6242b345e5cf3946c98f585
c:\f65be2c2b3f903d1e8b82942fd5e8f
c:\f7f6d21a696415c6b8b2869988dee5f6
c:\fbe5089abb1a64e9b560ac32
c:\ffeb5928a51b311728428591da5683e2

это дает мне все, что начинается с числа, но нужен более шаблон solid, а также шаблон, начинающийся с буквы, чтобы убедиться, что я случайно не удаляю другие windows каталоги без использования фильтра исключения

gci c:\ | ? {$_.name -match '^[^a-zA-Z].*'} 

Ответы [ 4 ]

1 голос
/ 25 января 2020

здесь немного другой способ определить, является ли имя dir шестнадцатеричной строкой. [ ухмылка ]

что он делает ...

  • создает список элементов dirinfo
    , вам нужно будет получить это через Get-ChildItem с соответствующие селекторы, чтобы получить только каталоги.
  • перебирает список
  • проверяет, содержит ли строка ТОЛЬКО шестнадцатеричные символы
    обратите внимание, что я добавил 3 элемента с недопустимыми символами - 2-й, 4-й и 6-й элементы.
  • записать сообщение "есть / нет"

код ...

# fake reading in a list of directories
#    in real life, use Get-ChildItem -Directory
$InStuff = @(
    [System.IO.DirectoryInfo]'c:\0260cbbd38dbbbea2543f8'
    [System.IO.DirectoryInfo]'c:\zzz096ea4b36d877b65dc6c'
    [System.IO.DirectoryInfo]'c:\0cf52cad06ab7b5cfe2b4042c8'
    [System.IO.DirectoryInfo]'c:\0d90c7a3bdd67-q-w-r-t'
    [System.IO.DirectoryInfo]'c:\0e2180b528a8c152566816291c2252'
    [System.IO.DirectoryInfo]'c:\1050_411ef7c0228177'
    [System.IO.DirectoryInfo]'c:\120dc98c3c427148e0e847'
    )

foreach ($IS_Item in $InStuff)
    {
    $IsHex = $IS_Item.Name -match "[a-f0-9]{$($IS_Item.Name.Length)}"

    if ($IsHex)
        {
        Write-Host ('{0} _is_ a hexadecimal string.' -f $IS_Item)
        }
        else
        {
        Write-Warning ('    {0} is not a hexadecimal string.' -f $IS_Item)
        }
    }

я оставляю вам право написать код удаления. [ ухмылка ]

1 голос
/ 25 января 2020

Это должно приблизить вас к получению имен папок в формате GUID (0..9 | a..f | A..F). Поскольку длина у вас произвольная, это совпадение должно приблизить вас к тому, что вы ищете. Я использовал это с вашими именами папок и получил все, кроме нескольких дополнительных, которые я создал. Протестируйте его перед удалением.

gci C:\ | ? { $_.Name -match '[0-9a-fA-F]{4}[0-9a-fA-F]{5}'}
0 голосов
/ 25 января 2020

Вероятно, нет точного ответа без дополнительной информации или создания дополнительных условий. Вы можете использовать подход сопоставления имен каталогов, основываясь на количестве чередований alphanumeri c, которые вы видите.

Get-ChildItem -Path 'C:\' -Force -Directory | Where Name -match '([a-f]+\d+){2}'
0 голосов
/ 25 января 2020

Чтобы найти все папки с именами, содержащими только шестнадцатеричные символы (только цифры 0..9 и буквы a..f):

Get-ChildItem -Path 'C:\' -Directory -Force | Where-Object { $_.Name -match '^[a-f\d]+$' }

Чтобы найти только те, которые начинаются с di git:

Get-ChildItem -Path 'C:\' -Directory -Force | Where-Object { $_.Name -match '^[\d][a-f\d]+$' }

Найти только тех, кто начинается с буквы a..f:

Get-ChildItem -Path 'C:\' -Directory -Force | Where-Object { $_.Name -match '^[a-f][a-f\d]+$' }

Надеюсь, что поможет

Регулярное выражение -match оператор работает без учета регистра, поэтому нет необходимости использовать [a-fA-F]

PS Поскольку вы также пометили этот вопрос как PowerShell-2.0, для версий ниже 3.0 переключатель -Directory отсутствует и вам нужно указать это в предложении Where-Object, например:

Get-ChildItem -Path 'C:\' -Force | Where-Object { $_.PSIsContainer -and $_.Name -match '^[a-f][a-f\d]+$' }
...