문제

버전 정보를 어떻게 얻을 수 있나요? .dll 또는 .exe PowerShell에 파일이 있나요?

나는 특히 관심이 있습니다 File Version, 다른 버전 정보(즉, Company, Language, Product Name, 등)도 도움이 될 것입니다.

도움이 되었습니까?

해결책

PowerShell은 호출할 수 있으므로 .그물 수업을 통해 다음을 수행할 수 있습니다.

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("somefilepath").FileVersion

아니면 여기에 언급됨 파일 목록에서:

get-childitem * -include *.dll,*.exe | foreach-object { "{0}`t{1}" -f $_.Name, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }

또는 스크립트로 사용하면 더욱 좋습니다. http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!125.entry

다른 팁

요즘에는 get-item 또는 get-childitem에서 fileVersionInfo를 얻을 수 있지만 업데이트 된 버전이 아닌 배송 된 제품에서 원본 파일 버전을 표시합니다. 예를 들어:

(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.FileVersion

흥미롭게도 업데이트 (패치)를 얻을 수 있습니다. ProductVersion 이것을 사용하여 :

(Get-Command C:\Windows\System32\Lsasrv.dll).Version

LSASRV와 같은 파일 (2014 년 11 월 SSL/TLS/RDS의 보안 문제로 인해 대체 됨) 에서이 두 명령에 의해보고 된 버전은 다르며 두번째 것 올바른 버전입니다.

그러나 LSASRV에서는 정확하지만 ProductVersion과 FileVersion이 다를 수 있습니다 (실제로는 일반적입니다). 그래서 얻는 유일한 방법 업데이트되었습니다 FileVersion은 다음과 같은 것과 같은 직접 구축하는 것입니다.

Get-Item C:\Windows\System32\Lsasrv.dll | ft FileName, File*Part

또는 오히려 다음과 같이 :

Update-TypeData -TypeName System.IO.FileInfo -MemberName FileVersion -MemberType ScriptProperty -Value {
   [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) | % {
      [Version](($_.FileMajorPart, $_.FileMinorPart, $_.FileBuildPart, $_.FilePrivatePart)-join".") 
   }
}

이제 당신이 할 때마다 Get-ChildItem 또는 Get-Item 당신은 가질 것입니다 FileVersion 업데이트 된 파일 버전을 보여주는 속성 ...

'dir'는 get-childitem의 별칭으로, versioninfo가있는 파일 시스템에서 부동산으로 호출 할 때 system.io.fileinfo 클래스를 다시 반환합니다. 그래서 ...

단일 파일의 버전 정보를 얻으려면 다음을 수행합니다.

PS C:\Windows> (dir .\write.exe).VersionInfo | fl


OriginalFilename : write
FileDescription  : Windows Write
ProductName      : Microsoft® Windows® Operating System
Comments         :
CompanyName      : Microsoft Corporation
FileName         : C:\Windows\write.exe
FileVersion      : 6.1.7600.16385 (win7_rtm.090713-1255)
ProductVersion   : 6.1.7600.16385
IsDebug          : False
IsPatched        : False
IsPreRelease     : False
IsPrivateBuild   : False
IsSpecialBuild   : False
Language         : English (United States)
LegalCopyright   : © Microsoft Corporation. All rights reserved.
LegalTrademarks  :
PrivateBuild     :
SpecialBuild     :

여러 파일의 경우 :

PS C:\Windows> dir *.exe | %{ $_.VersionInfo }

ProductVersion   FileVersion      FileName
--------------   -----------      --------
6.1.7600.16385   6.1.7600.1638... C:\Windows\bfsvc.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\explorer.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\fveupdate.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\HelpPane.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\hh.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\notepad.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\regedit.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\splwow64.exe
1,7,0,0          1,7,0,0          C:\Windows\twunk_16.exe
1,7,1,0          1,7,1,0          C:\Windows\twunk_32.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\winhlp32.exe
6.1.7600.16385   6.1.7600.1638... C:\Windows\write.exe

나는 설치하는 것을 선호한다 PowerShell 커뮤니티 확장 그리고 제공하는 get-fileversioninfo 함수를 사용하십시오.

그렇게 :

Get-FileVersionInfo MyAssembly.dll

다음과 같은 출력으로

ProductVersion   FileVersion      FileName
--------------   -----------      --------
1.0.2907.18095   1.0.2907.18095   C:\Path\To\MyAssembly.dll

나는 큰 성공을 거두면서 전체 어셈블리 디렉토리에 대해 그것을 사용했습니다.

이를 수행하는 또 다른 방법은 내장 파일 액세스 기술을 사용하는 것입니다.

(get-item .\filename.exe).VersionInfo | FL

따라서 특정 속성을 versioninfo에서 얻을 수도 있습니다.

(get-item .\filename.exe).VersionInfo.FileVersion

이것은 DIR 기술에 매우 가깝습니다.

나는 이것이 이미 대답을 받았다는 것을 알고 있지만, 더 적은 수의 캐릭터를 입력하는 데 관심이 있다면, 이것이 PS v3+에서 이것을 가장 짧은 방법이라고 생각합니다.

ls application.exe | % versioninfo
  • ls 별명입니다 Get-ChildItem
  • % 별명입니다 ForEach-Object
  • versioninfo 다음은 속기의 글쓰기 방법입니다 {$_.VersionInfo}

사용의 이점 ls 이러한 방식으로 Subfolders 내에서 주어진 파일을 찾기 위해 쉽게 조정할 수 있습니다. 예를 들어, 다음 명령은 호출되는 모든 파일에 대한 버전 정보를 반환합니다. application.exe 하위 폴더 내에서 :

ls application.exe -r | % versioninfo
  • -r 별명입니다 -Recurse

추가하여 이것을 더 세분화 할 수 있습니다 -ea silentlycontinue 폴더의 권한 오류와 같은 것들을 무시하려면 검색 할 수 없습니다.

ls application.exe -r -ea silentlycontinue | % versioninfo
  • -ea 별명입니다 -ErrorAction

마지막으로, 결과에서 타원 (...)을 얻는 경우 추가 할 수 있습니다. | fl 정보를 다른 형식으로 반환합니다. 이것은 목록에 형식이 지정되어 있지만 결과 당 한 줄에 훨씬 더 자세한 정보를 반환합니다.

ls application.exe -r -ea silentlycontinue | % versioninfo | fl
  • fl 별명입니다 Format-List

나는 이것이 XCUD의 대답과 매우 유사하다는 것을 알고 있습니다. ls 그리고 dir 둘 다 별명입니다 Get-ChildItem. 그러나 나는 나의 "가장 짧은"방법이 누군가에게 도움이되기를 바라고 있습니다.

마지막 예제는 다음과 같은 방식으로 오랫동안 작성할 수 있습니다.

Get-ChildItem -Filter application.exe -Recurse -ErrorAction SilentlyContinue | ForEach-Object {$_.VersionInfo} | Format-List

...하지만 내 길은 더 시원하고 일부는 기억하기가 더 쉽다고 생각합니다. (그러나 대부분 시원합니다).

이것은 기반을 둔 다른 대답에 대해서는하지만 정확히 다음과 같습니다.

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

나는 이것이 유용하다고 생각한다 :

function Get-Version($filePath)
{
   $name = @{Name="Name";Expression= {split-path -leaf $_.FileName}}
   $path = @{Name="Path";Expression= {split-path $_.FileName}}
   dir -recurse -path $filePath | % { if ($_.Name -match "(.*dll|.*exe)$") {$_.VersionInfo}} | select FileVersion, $name, $path
}

Ebgreen이 말했듯이 [System.diagnostics.fileversioninfo] :: getVersionInfo (Path)는 작동하지만 FileVersionInfo의 모든 구성원을 얻을 수 있음을 기억하십시오.

[System.Diagnostics.FileVersionInfo]::GetVersionInfo(path).CompanyName

여기에 문서화 된 FileVersionInfo의 모든 멤버를 사용할 수 있어야합니다. 이는 기본적으로 파일에 대해 원할 수있는 모든 것을 얻을 수 있습니다.

여기서 대체 방법입니다. get-wmiobject cim_datafile을 사용하여 버전을 선택합니다.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top