[file] PowerShell에서 파일 버전 가져 오기

PowerShell 의 .dll또는 .exe파일에서 버전 정보를 어떻게 얻을 수 있습니까?

나는 특별히에 관심이 File Version다른 버전 정보 (즉,하지만, Company, Language, Product Name, 등)뿐만 아니라 도움이 될 것입니다.



답변

PowerShell은 .NET 클래스 를 호출 할 수 있으므로 다음을 수행 할 수 있습니다.

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

또는 파일 목록에 여기표시된 대로 :

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

또는 스크립트로 더 좋을 수도 있습니다 : https://jtruher3.wordpress.com/2006/05/14/powershell-and-file-version-information/


답변

요즘 Get-Item 또는 Get-ChildItem에서 FileVersionInfo를 가져올 수 있지만 업데이트 된 버전이 아니라 배송 된 제품의 원본 FileVersion이 표시됩니다. 예를 들어 :

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

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

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

“원본”과 “패치 된”사이의 차이점은 기본적으로 FileVersion이 계산되는 방식 때문입니다 ( 문서 참조 ). 기본적으로 Vista 이후 Windows API GetFileVersionInfo는 언어 중립 파일 (exe / dll)에서 버전 정보의 일부를 쿼리하고 언어 별 mui 파일에서 수정되지 않은 부분 (파일이 변경 될 때마다 업데이트되지 않음)을 쿼리합니다. ).

그래서 LSASRV 같은 파일을 사용하여 (인해 SSL / TLS 보안 문제로 대체되었다 / RDS 2014 년 11 월) 버전은 달랐다하고 (해당 날짜 이후에 적어도 동안) 이들 두 명령에 의해보고 된 두 번째 하나 는 IS 더 “올바른”버전.

그러나 LSASrv에서는 정확하지만 ProductVersion과 FileVersion이 다를 수 있습니다 (사실 공통적 임). 따라서 어셈블리 파일에서 업데이트 된 Fileversion을 바로 얻는 유일한 방법 은 다음과 같이 파트에서 직접 빌드하는 것입니다.

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

또는 여기에서 데이터를 가져 와서 :

[System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)

PowerShell에서 TypeData를 업데이트하여 모든 FileInfo 객체에 쉽게 추가 할 수 있습니다.

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또는 업데이트 된 FileVersion을 보여주는 속성을 Get-Item갖게 될 것입니다 FileVersion


답변

‘dir’은 VersionInfo를 속성으로하는 파일 시스템에서 System.IO.FileInfo 클래스를 호출 할 때이를 반환하는 Get-ChildItem의 별칭입니다. 그래서 …

단일 파일의 버전 정보를 얻으려면 다음을 수행하십시오.

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 파일 이름
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 C : \ Path \ To \ MyAssembly.dll

나는 그것을 전체 성공 디렉토리에 대해 사용했다.


답변

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

ls application.exe | % versioninfo
  • ls 에 대한 별칭입니다 Get-ChildItem
  • % 에 대한 별칭입니다 ForEach-Object
  • versioninfo 여기에 짧은 쓰기 방법이 있습니다 {$_.VersionInfo}

ls이러한 방식 으로 사용 하면 하위 폴더 내에서 지정된 파일을 찾도록 쉽게 조정할 수 있다는 이점 이 있습니다. 예를 들어 다음 명령은 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-item .\filename.exe).VersionInfo | FL

VersionInfo에서 특정 속성을 가져올 수도 있습니다.

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

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


답변

이것은 다른 답변을 기반 으로하지만 정확히 내가 추구 한 것입니다.

(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion