답변:
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 C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
와는의 FileVersion의 마지막 부분에 FilePrivatePart를 비교합니다. FileVersion은 패치 된 버전이 아니라 원래 제공된 것을 보여줍니다. 반면이 명령은 패치 된 버전 번호를 표시합니다. (get-command C : \ Windows \ System32 \ ubpm.dll). Version
(Get-Command ... ).Version
반환 한다는 것입니다 . 실제로 업데이트 된 FileVersion 을 실제로 반환하는 전체 솔루션을 보려면 아래 답변에서 Update-TypeData 예제를 확인하십시오.
요즘 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
...
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
dll 파일에 적용되는 것에 흥미가 있습니다. 그 효과에 대해 자세히 설명해 주시겠습니까?
(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
이 질문에 설명 된대로 같은 PRODUCTVERSION 정보를 얻을 수있는 새로운 간단한 방법은? 저는 Microsoft가이 용어를 ProductVersion
일관되게 사용한다고 믿지 않습니다 .
'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
Get-Command
dll 파일에 적용되는 것에 흥미가 있습니다. FileVersionInfo 속성을 호출하기 전에 그 효과에 대해 자세히 설명해 주시겠습니까?
FileVersionInfo
exe 파일과 마찬가지로 포함합니다 . 이 명령을 경로에 적용하면 파일 버전 정보를 얻을 수 있습니다!
나는 이것이 유용하다고 생각한다.
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