如何在Powershell中创建仅接受字符串,接受变量的函数?

时间:2019-08-01 16:27:35

标签: powershell

我想在Powershell中运行一个名为Get-OSArchitecture的函数,当您给它提供域名时,它告诉我计算机是32位还是64位系统。但是,它只接受诸如“ SALES-DENNY”之类的字符串,而不接受带有存储字符串之类的变量,例如$ string1。我玩过一种叫做Out-String的东西,但是这个函数确实很固执,因为它获取字符串而与变量无关。

以下代码用于获取全局Get-OSArchitecture函数:

function global:Get-OSArchitecture { 

#Requires -Version 2.0 
[CmdletBinding()] 
 Param  
   ( 
    [Parameter(Mandatory=$false, 
               Position=1, 
               ValueFromPipeline=$true, 
               ValueFromPipelineByPropertyName=$true)] 
    [String[]]$ComputerName = $env:COMPUTERNAME       
   )#End Param  

Begin 
{ 
 Write-Verbose "Retrieving Computer Info . . ." 
} 
Process 
{ 
$ComputerName | foreach {  
$ErrorActionPreference = 0 
$Computer = $_ 
$Windir,$OSArchitecture,$OSVersion = Get-WmiObject -class Win32_OperatingSystem -ComputerName $_ |  
    foreach {$_.WindowsDirectory,$_.OSArchitecture,$_.Version} 
$SysDrive = ($Windir -split ":")[0] + "$" 
# $OSVersion[0] 
# $OSArchitecture is only suppored on OSVersion -ge 6 
# I was going to test for that, however now I just test if $OSArchitecture -eq $True 
Write-Verbose "Operating System version on $Computer is: $OSVersion" 
if ($OSArchitecture) 
    { 
        New-Object PSObject -Property @{  
        Hostname=$Computer 
        OSArchitecture=$OSArchitecture 
        SysDrive=$SysDrive 
        OSVersion=$OSVersion 
        WinDir=$WinDir 
        } 
    } 
else 
    { 
        # check the program files directory 
        write-verbose "System Drive on $Computer is: $SysDrive" 
        $x64 =  "\\$Computer\" + $SysDrive + "\Program Files (x86)" 
        if (test-path ("\\$Computer\" + $SysDrive)) 
            { 
                if (test-path $x64) 
                    { 
                        New-Object PSObject -Property @{  
                        Hostname=$Computer 
                        OSArchitecture="64-bit" 
                        SysDrive=$SysDrive 
                        OSVersion=$OSVersion 
                        WinDir=$WinDir 
                        } 
                    } 
                elseif (!(test-path $x64)) 
                    { 
                        New-Object PSObject -Property @{  
                        Hostname=$Computer 
                        OSArchitecture="32-bit" 
                        SysDrive=$SysDrive 
                        OSVersion=$OSVersion 
                        WinDir=$WinDir 
                        } 
                    } 
            } 
        else {"Something wrong determining the System Drive"}  
    } 
} | select Hostname,OSArchitecture,SysDrive,WinDir,OSVersion 

}#Process             
End             
{    

}#End  


}#Get-OSArchitecture 

我的问题从下面开始。

$string1 = "SALES-DENNY"

Get-OSArchitecture $string1

以上操作失败。 下面的作品。

Get-OSArchitecture "SALES-DENNY"

我希望该函数给出名称为“ SALES-DENNY”的计算机的正确体系结构,但是如果我不将其作为字符串输入,则总是会得到空白结果。

1 个答案:

答案 0 :(得分:0)

尽管将计算机名作为硬编码字符串或作为变量中的名称或IP来命名都没有关系,但我相信您可以通过不测试Program Files (x86)目录来改善功能。
相反,您可以依靠其他两个WMI功能来获得操作系统的“位”:

function Get-OSArchitecture {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0)]
        [string[]]$ComputerName = $env:COMPUTERNAME
    )
    process {
        foreach ($computer in $ComputerName) {
            Write-Verbose "Retrieving info for computer '$computer'"

            $info = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer | 
                    Select-Object @{Name = 'HostName'; Expression = { $_.PSComputerName}},
                                  OSArchitecture,
                                  @{Name = 'SysDrive'; Expression = { '{0}$' -f ($_.SystemDrive).Substring(0,1) }},
                                  @{Name = 'WinDir'; Expression = { $_.WindowsDirectory}},
                                  @{Name = 'OSVersion'; Expression = { $_.Version }}

            if ($info.OSArchitecture) {
                $info.OSArchitecture = '{0}-bit' -f ($info.OSArchitecture -replace '\D+','')
            }
            else {
                $info.OSArchitecture = '{0}-bit' -f (Get-WmiObject -Class Win32_Processor -ComputerName $computer).AddressWidth
                # or do:
                # $info.OSArchitecture = '{0}-bit' -f (((Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computer).SystemType -replace '\D+', '') -replace '86', '32')
            }
            # emit info
            $info
        }
    }
}

希望有帮助