如何让功能显示一个部分

时间:2015-03-02 14:57:12

标签: powershell

教我自己的功能 - 我写了下面的内容,我现在遇到的问题是:

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 }

3 个答案:

答案 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

}

}