教我自己的功能 - 我写了下面的内容,我现在遇到的问题是:
1.输出显示在格式的哈希表中 - 即@{FileVersion=6.1.7601.18606; IsReadOnly?=False; Directory=C:\windows\system32}
。有没有办法不以这种格式显示它?
2.对于IF语句,如何让代码只看输出的ProductVersion位而不是整个函数...或者是函数的关键点,我应该只有一个函数分别获取文件版本?
clear
function fileversion {
param ([string]$fileToCheck)
$fileInput = Get-Item $fileToCheck
$versionCheck = $fileInput.VersionInfo.ProductVersion
$DirectoryOfFile = $fileInput.DirectoryName
$IsReadOnly = $fileInput.IsReadOnly
$obj = New-Object psobject
$obj | Add-Member NoteProperty FileVersion $versionCheck
$obj | Add-Member NoteProperty IsReadOnly? $IsReadOnly
$obj | Add-Member NoteProperty Directory $DirectoryOfFile
Write-host $obj
}
$firstFile = fileversion C:\windows\system32\lsasrv.dll
If ($versionCheck -eq '6.1.7601.18606')
{ Write-host "File for is $TRUE" }
Else
{ Write-Host $False }
答案 0 :(得分:1)
不知道为什么需要一个函数,因为最后你只是使用了返回对象的一个属性。不过,如果你需要这个功能,你可以简化它。
function fileversion{
param ([string]$fileToCheck)
Get-Item $fileToCheck | Select-Object @{Label="FileVersion";Expression={$_.VersionInfo.ProductVersion}},
@{Label="IsReadOnly?";Expression={$_.IsReadOnly}},
@{Label="Directory";Expression={$_.DirectoryName}}
}
当当前的对象已经拥有您需要的对象时,无需创建新对象。我们使用计算属性来创建您想要的属性名称。
默认情况下,函数中的所有输出都将返回到输出流。通过将$obj
发送到Write-Host
,您将从流中删除该数据。您说的输出是Write-host
将整个对象转换为[string]
简单如果
根据您的需要,您也可以做到这一点。这样你就不需要自定义函数了
$version = (Get-Item C:\windows\system32\lsasrv.dll).VersionInfo.ProductVersion
If($version -eq '6.1.7601.18606'){
write-host "Version match"
} Else {
write-host "$version does not match"
}
您始终可以将文件路径更改为变量。再次,这只是建议。请做任何让你的脚本生活舒适的事情。
答案 1 :(得分:0)
使用 Write-output 而不是write-host,并在返回的对象上使用正确的属性名称(FileVersion)检查版本:
If ($firstFile.FileVersion -eq '6.1.7601.18606')
{ Write-host "File for is $TRUE" }
Else
{ Write-Host $False }
答案 2 :(得分:0)
**修订** 1.)'IF'条件语句应在创建$ obj之前应用于属性。 2.)为了使函数更加灵活和可重用,您应该扩展参数条件,以允许来自管道和值数组的值作为输入。
function fileversion {
param(
[Parameter(Mandatory=$True,
ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$True)]
[Alias('files')]
[string[]]$filesToCheck
)
$fileInput = Get-Item $filesToCheck
foreach($f in $fileInput) {
$properties = @{
'File'=Split-Path $f -Leaf;
'FileVersion'=$f.VersionInfo.ProductVersion;
'CorrectVersion'=IF($versionCheck -eq '6.1.7601.18606') {$TRUE } ELSE {$False };
'IsReadyOnly'=$f.IsReadOnly;
'DirectoryOfFile'=$f.DirectoryName
}
$obj = New-Object psobject -Property $properties
Write-Output $obj
}
}