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