PowerShell에서 파일 버전 가져 오기


146

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

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

답변:


140

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/


8
.NET 객체가 필요없는 솔루션에 대해서는 @Jaykul을 참조하십시오. 이럴 Jaykul의 응답 : 답으로 선택되어 있어야합니다
토마스 브랫에게

2
다른 답변은 더 짧은 명령을 제공하지만 내가 시도한 모든 정보는 너무 많은 정보를 인쇄하고 파일 경로를 "..."로 자릅니다. 이 답변의 두 번째 명령은 필요한 것을 제공하고 파일 디렉토리에서 작동하며 다른 정보를 반환하도록 수정하는 방법을 쉽게 볼 수있는 형식으로되어 있습니다. 명령의 .LegalCopyright를 .FileVersion으로 변경하십시오.
Dennis

이것은 .NET EXE의 올바른 버전입니다. Jaykul의 대답은 같은 버전을 얻지 못합니다.
ashes999

실제로 옳지 않습니다. 에서 봐 get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force와는의 FileVersion의 마지막 부분에 FilePrivatePart를 비교합니다. FileVersion은 패치 된 버전이 아니라 원래 제공된 것을 보여줍니다. 반면이 명령은 패치 된 버전 번호를 표시합니다. (get-command C : \ Windows \ System32 \ ubpm.dll). Version
Jaykul

가장 최근에 패치 된 C : \ Windows \ System32 \ Lsasrv.dll 이 더 좋은 예입니다 . 그러나 진실은 ProductVersionFileVersion 이 아니라 때로는 ProductVersion(Get-Command ... ).Version반환 한다는 것입니다 . 실제로 업데이트 된 FileVersion 을 실제로 반환하는 전체 솔루션을 보려면 아래 답변에서 Update-TypeData 예제를 확인하십시오.
Jaykul

170

요즘 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...


10
그리고 이것을 Lars의 인정 된 답변과 동일하게 만들려면 다음을 사용하십시오(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
rand0m1

1
Get-Commanddll 파일에 적용되는 것에 흥미가 있습니다. 그 효과에 대해 자세히 설명해 주시겠습니까?
Stephane Rolland

3
경고 FileVersionInfo.FileVersion은 최신이 아닌 문자열 표현입니다. FileVersionInfo.FileMajorPart, FileMinorPart, FileBuildPart, FilePrivatePart를 봐야합니다. 참조 있는 GetFileVersionInfo ()는 잘못된 파일의 버전 정보를 반환
bdeem

1
@Jaykul 이전의 의견 / 질문을 명확히하기 위해 : 원래 답변은 몇 가지 흥미로운 컨볼 루션을 통해 PowerShell에서 ProductVersion을 얻는 방법을 보여줍니다. ProductVersion은 FileVersion보다 더 중요 할 수 있습니다. 원래 답변은 VersionInfo.ProductVersion 속성에 대해 언급하지 않았으며 아마도 답변이 이전 날짜이기 때문입니다. 가 (Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion이 질문에 설명 된대로 같은 PRODUCTVERSION 정보를 얻을 수있는 새로운 간단한 방법은? 저는 Microsoft가이 용어를 ProductVersion일관되게 사용한다고 믿지 않습니다 .
Tydaeus

2
@Tydaeus 새로운 것이 아닙니다. 문서에서 찾아서 얼마나 멀리 돌아가는지 확인할 수 있습니다 (.NET 1.1) 😏. 내 대답은 ProductVersion을 언급하지만 모든 ScriptProperty 코드로 계산하는 버전은 ProductVersion이 아니라 실제 FILE 버전입니다. 때로는 동일하지만 항상 그런 것은 아닙니다. 😔 불행히도 모든 실제 예제는 Windows의 다음 서비스 릴리스에서 변경된 내용을 보여줍니다. docs.microsoft.com/en-us/dotnet/api/…
Jaykul

50

'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

회사 이름 및 설명과 같은 다른 일반적인 메타 데이터도 포함한다는 점에서 도움이됩니다.
David Faivre

16

PowerShell 커뮤니티 확장 을 설치하고 제공하는 Get-FileVersionInfo 함수 만 사용하는 것이 좋습니다.

이렇게 :

Get-FileVersionInfo MyAssembly.dll

다음과 같은 출력으로 :

ProductVersion FileVersion 파일 이름
-------------- ----------- --------
1.0.2907.18095 1.0.2907.18095 C : \ Path \ To \ MyAssembly.dll

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


12

나는 이것이 이미 대답했다는 것을 알고 있지만, 더 적은 수의 문자를 입력하는 데 관심이 있다면 이것이 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

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


11

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

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

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

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

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


(get-item \\ "$ computerName"\ "C $ \ Program Files \ Symantec AntiVirus \ VPDN_LU.exe"). VersionInfo.FileVersion이 저에게 효과적이었습니다. 루프에서 컴퓨터 이름을 추가해야했습니다.
Tequila

7

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

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

Get-Commanddll 파일에 적용되는 것에 흥미가 있습니다. FileVersionInfo 속성을 호출하기 전에 그 효과에 대해 자세히 설명해 주시겠습니까?
Stephane Rolland

dll 파일은 FileVersionInfoexe 파일과 마찬가지로 포함합니다 . 이 명령을 경로에 적용하면 파일 버전 정보를 얻을 수 있습니다!
noelicus

4
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("Path\To\File.dll")

4

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

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
}

이것이 VBScript입니까?
macetw

1
아니요
Powershell

2

EBGreen이 말했듯이 [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (path)는 작동하지만 FileVersionInfo의 모든 멤버를 가져올 수도 있습니다. 예를 들면 다음과 같습니다.

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

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


1

대체 방법이 있습니다. Get-WmiObject CIM_DATAFILE을 사용하여 버전을 선택합니다.

(Get-WmiObject -Class CIM_DataFile -Filter "Name='C:\\Windows\\explorer.exe'" | Select-Object Version).Version

이름에 공백이있는 공유 경로를 사용하여 "이 개체에서 '버전'속성을 찾을 수 없습니다. 속성이 있는지 확인하십시오."
AnneTheAgile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.