PowerShell에서 파일 버전 가져오기
-
09-06-2019 - |
문제
버전 정보를 어떻게 얻을 수 있나요? .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