2013-12-12 9 views
0

Мне нужно извлечь файлversion некоторых DLL-файлов, о которых я не знаю имя. Все, что я знаю, это то, где находится файл, содержащий файл, и его имя совпадает с папкой, скрытой ниже.Powershell найти папки и файлы с тем же именем

На самом деле это что-то вроде этого:

C: \ Inetpub \ Wwwroot \ APPFolder \ Bin \ файлы (где имя вложенного совпадает с именем файла в папке Bin)

После многих попыток (и много неудач), я пошел немного назад и вперед, и я теперь, опираясь удобно на этом кусочке кода .... близко, но не сигару:

Get-ChildItem -Path c:\temp\Documents -recurse -Filter *.dll | where-object{ (Get-ChildItem -Path c:\temp\Documents -recurse -Filter *.dll) -match $_.Directory.Name } 

Этот код автоматически восстанавливает файлы для всех файлов в \ temp \ documents, а затем m атакует файлы в папках, что приятно ... но не совсем то, что я хотел. Кроме того, приведенный выше код дает папки, в которых находятся файлы, которые соответствуют папкам, в которых они находятся, и не только сопоставленный файл.

Итак ... Любые предложения? В упомянутой выше папке bin есть несколько файлов DLL, что является частью того, почему мне нужно выбрать тот, который имеет то же имя, что и APPFolder.

ответ

0

Вот пример кода, который предоставит вам полный путь к файлам, которые вы ищете.

dir . -Recurse -Filter *.dll | ? { -not $_.PSIsContainer } | ? { $_.FullName.ToLower().Contains([IO.Path]::DirectorySeparatorChar + [IO.Path]::GetFileNameWithoutExtension($_.Name.ToLower()) + [IO.Path]::DirectorySeparatorChar) } | Select -ExpandProperty FullName 

разбив его, мы имеем:

dir . -Recurse -Filter *.dll 

Это будет искать в текущем каталоге и его дети рекурсивно для всех файлов, которые имеют расширение DLL

? { -not $_.PSIsContainer } 

Это устранит каталоги это конец в .dll. Маловероятно, но возможно

? { $_.FullName.ToLower().Contains([IO.Path]::DirectorySeparatorChar + [IO.Path]::GetFileNameWithoutExtension($_.Name.ToLower()) + [IO.Path]::DirectorySeparatorChar } 

Это будет фильтровать вплоть до библиотек DLL, которые имеют имя файла такой же, как имя каталога над ним в пути.

Select -ExpandProperty FullName 

Это даст вам полный путь к файлу.

Затем вы можете ответить на этот вопрос here, чтобы получить FileVersion.

+0

Alright :) По крайней мере, он дал только один файл, который я хотел ... Если файл находился под той же папкой, что и подразумевалось имя. – SkyRaider

+0

Единственная проблема с тем, что файлы, которые мне нужно сопоставить, находятся в другой папке. Как вы сказали, «это будет отфильтровывать его до библиотек DLL, у которых есть имя файла, такое же, как имя каталога, в котором он находится», в то время как мне нужно что-то вроде «Это будет отфильтровывать его до DLL с именем файла то же, что и имя каталога, в котором он находится, и это подкаталоги ». Файлы dll расположены на один шаг ниже папки с тем же именем. – SkyRaider

+0

По-видимому, он перечисляет подкаталоги только с $ _. Directory.Name или просто GetFileNameWithout ..... но при попытке сопоставить друг с другом он соответствует только папке, в которой он находится (одна папка в основной папке) – SkyRaider

Смежные вопросы