Как я могу получить список каталогов DLL с ProductName и ProductVersion? - PullRequest
3 голосов
/ 01 декабря 2008

Когда я просматриваю каталог в проводнике Windows, я вижу свойства ProductName и ProductVersion для библиотек DLL в этом каталоге.

Мне нужно экспортировать этот список DLL с ProductName и ProductVersion в текстовый файл.

Если я сделаю c:\>dir *.dll > test.log, test.log не будет иметь ProductName и ProductVersion.

Может ли кто-нибудь помочь мне экспортировать эти свойства в файл вместе с именем файла?

Даже если это бесплатный инструмент или какой-либо другой dir переключатель, это будет полезно.

Ответы [ 6 ]

2 голосов
/ 01 декабря 2008

PowerShell - ваш друг здесь, и он свободно (как в пиве) доступен от Microsoft.

Ниже приведен один вкладыш, в котором имя test, версия продукта и имя файла всех dll в каталоге Windows включены в test.log:

dir c:\windows\*.dll | % {[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_)} | % { $_.ProductName + ", " + $_.ProductVersion + ", " + $_.FileName} > test.log

ОК, так что это длинная строка - но это все равно только одна строка в командной строке.

PowerShell afficionados, вероятно, сможет еще больше сузить сказанное. Обратите внимание, что PowerShell позволяет нам использовать библиотеку базовых классов .Net (или даже ваши собственные сборки), такие как System.Diagnostics.FileVersionInfo из командной строки!

Если вы еще не играли с PowerShell, у вас есть угощение, особенно если вы являетесь разработчиком .Net:)

1 голос
/ 01 декабря 2008

Добавление версии VB.Net в список:

Sub CreateLog(ByVal Logfile As String, ByVal PathToLog As String, Optional ByVal SearchPattern As String = "*.*")

    Dim FileInfo As FileVersionInfo
    Dim ret As String = ""
    For Each File As String In IO.Directory.GetFiles(PathToLog, SearchPattern)
        FileInfo = FileVersionInfo.GetVersionInfo(File)
        If FileInfo.ProductName & FileInfo.ProductVersion <> "" Then
            ret &= FileInfo.ProductName & ", " & FileInfo.ProductVersion & vbCrLf
        End If
    Next

    IO.File.WriteAllText(Logfile, ret)

End Sub

Назовите его: CreateLog ("c: \ log.txt", "c: \ windows", "* .dll")

Редактировать: добавлен searchpattern.

1 голос
/ 01 декабря 2008

Вы можете сделать это довольно легко с помощью приложения .NET.

using System;
using System.Diagnostics;

static class MainClass
{
    static void Main(string[] args)
    {

        FileVersionInfo info = FileVersionInfo.GetVersionInfo("c:\\test.txt");

        // Display version information.
        Console.WriteLine("Checking File: " + info.FileName);
        Console.WriteLine("Product Name: " + info.ProductName);
        Console.WriteLine("Product Version: " + info.ProductVersion);
        Console.WriteLine("Company Name: " + info.CompanyName);

    }
}

Очевидно, вам нужно добавить функцию, которая извлекает все файлы в указанном каталоге.

1 голос
/ 01 декабря 2008

Используя VBScript, вы можете сделать следующее:

Set objShell = CreateObject ("Shell.Application")
Set objFolder = objShell.Namespace ("C:\Scripts")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim arrHeaders(40)

For i = 0 to 40
    arrHeaders(i) = objFolder.GetDetailsOf (objFolder.Items, i)
Next

For Each strFileName in objFolder.Items
    For i = 0 to 40
        Wscript.echo arrHeaders(i) & ": " & objFolder.GetDetailsOf (strFileName, i) 
    Next
    Wscript.Echo
Next
0 голосов
/ 02 декабря 2008

Интересно, я не знал эту функцию GetDetailsOf.
Я задавался вопросом о произвольном размере ...
Я не уверен, каков предел, который, кажется, варьируется между папками или, по крайней мере, пользовательскими настройками или чем-то еще, поэтому я сделал что-то более гибкое:

Set shell = CreateObject("Shell.Application")
Set folder = shell.Namespace("D:\Documents")

Set fso = CreateObject("Scripting.FileSystemObject")
For Each fileName in folder.Items
  i = 0
  emptyNb = 0
  Do
    detail = folder.GetDetailsOf(folder.Items, i)
    If detail = "" Then
      emptyNb = emptyNb + 1
    Else
      detailValue = folder.GetDetailsOf(fileName, i)
      If detailValue <> "" Then
        Wscript.Echo i & " " & detail & ": " & detailValue
      End If
      emptyNb = 0
    End If
    i = i + 1
  Loop While emptyNb < 3 ' Arbirary, adjust as you see fit
  detailValue = folder.GetDetailsOf(fileName, -1)
  If detailValue <> "" Then
    Wscript.Echo "Tooltip:" & vbCrLf & detailValue
  End If
  Wscript.Echo
Next

Чтобы ответить на вопрос, вы можете проверить, когда detail равно информации, которую вы ищете, и отобразить только эти значения.

0 голосов
/ 01 декабря 2008

Я вообще не могу говорить с этим программным обеспечением, но, похоже, это делает то, что вы ищете:

http://www.softpedia.com/get/Programming/Other-Programming-Files/STRFINFO.shtml

SYNTAX
~~~~~~
StrFInfo[.EXE] ExeDllOcxFileName  [Property1  [Property2 ...]]

COMMON PROPERTIES
~~~~~~~~~~~~~~~~~
FileDescription  FileVersion InternalName
OriginalFileName ProductName ProductVersion
CompanyName LegalCopyRight $Translation
...