Can';t使用PowerShell从远程服务器访问环境变量

Can';t使用PowerShell从远程服务器访问环境变量,powershell,Powershell,我有一个脚本来查询远程windows服务器列表,以检索我创建的环境变量的值 我可以看到变量确实存在,因为当我打印所有变量时,我可以看到它:$EnvObj: try { $Name="MY_VAR" $VerbosePreference="Continue" # Read a list of server names $file = New-Object System.IO.StreamReader -Arg "C:\Users\foo\Documents\te

我有一个脚本来查询远程windows服务器列表,以检索我创建的环境变量的值

我可以看到变量确实存在,因为当我打印所有变量时,我可以看到它:
$EnvObj

try 
{
    $Name="MY_VAR"
    $VerbosePreference="Continue"

    # Read a list of server names
    $file = New-Object System.IO.StreamReader -Arg "C:\Users\foo\Documents\test.txt"

    while ($Computer = $file.ReadLine()) 
    {    
        if(!(Test-Connection -ComputerName $Computer -Count 1 -quiet)) 
        {            
            Write-Verbose "$Computer is not online"            
            Continue            
        }            

        try 
        {            
            $EnvObj = @(Get-WMIObject -Class Win32_Environment -ComputerName $Computer -EA Stop)                        
            if(!$EnvObj) 
            {            
               Write-Verbose "$Computer returned empty list of environment variables"            
               Continue            
            }            

            if($Name) 
            {         
                Write-Verbose "Looking for environment variable with the name $name"            
                $Env = $EnvObj | Where-Object {$_.Name -eq $Name}        

                # None of these work but printing $EnvObj shows that $Name ("MY_VAR") is there:
                $res=[environment]::GetEnvironmentVariable($Name, "Process")
                $res1=[environment]::GetEnvironmentVariable($Name, "User")
                $res2=[environment]::GetEnvironmentVariable($Name, "Machine")
                $res4=$Env:Name

                if(!$Env) 
                {            
                    Write-Verbose "$Computer has no environment variable with name $Name"            
                    Continue            
                }                                            
            } 
            else 
            {            
                Write-Verbose "No environment variable specified. Listing all"            
                $EnvObj # shows that the requested environment variable is present            
            }            
        } 
        catch 
        {            
            Write-Verbose "Error occurred while querying $Computer. $_"            
            Continue            
        }           
    }
}
finally
{
    $file.close()
} 
变量本身由
所有:

。。。即使当我打印
$EnvObj
对象时,我可以看到
$Name
肯定在那里

怎么了?

你的线路

$EnvObj = @(Get-WMIObject -Class Win32_Environment -ComputerName $Computer -EA Stop) 
将返回一个
[ManagementObject]
数组

要检查所有属性,可以通过管道将其中一个对象传送到
Get Member

$EnvObj[0] | Get-Member

   TypeName: System.Management.ManagementObject#root\cimv2\Win32_Environment

Name                MemberType    Definition                             
----                ----------    ----------                             
PSComputerName      AliasProperty PSComputerName = __SERVER              
Caption             Property      string Caption {get;set;}              
Description         Property      string Description {get;set;}          
InstallDate         Property      string InstallDate {get;set;}          
Name                Property      string Name {get;set;}                 
Status              Property      string Status {get;set;}               
SystemVariable      Property      bool SystemVariable {get;set;}         
UserName            Property      string UserName {get;set;}             
VariableValue       Property      string VariableValue {get;set;}        
__CLASS             Property      string __CLASS {get;set;}              
__DERIVATION        Property      string[] __DERIVATION {get;set;}       
__DYNASTY           Property      string __DYNASTY {get;set;}            
__GENUS             Property      int __GENUS {get;set;}                 
__NAMESPACE         Property      string __NAMESPACE {get;set;}          
__PATH              Property      string __PATH {get;set;}               
__PROPERTY_COUNT    Property      int __PROPERTY_COUNT {get;set;}        
__RELPATH           Property      string __RELPATH {get;set;}            
__SERVER            Property      string __SERVER {get;set;}             
__SUPERCLASS        Property      string __SUPERCLASS {get;set;}         
PSStatus            PropertySet   PSStatus {Status, Name, SystemVariable}
ConvertFromDateTime ScriptMethod  System.Object ConvertFromDateTime();   
ConvertToDateTime   ScriptMethod  System.Object ConvertToDateTime();    
从中可以看到value属性被称为
VariableValue

所以


您的.NET行
[environment]::GetEnvironmentVariable…
正在查看本地PC,而不是远程PC。您的
$Env
变量中有什么?您好,Jan,
$Env
包含我要查找的数据,但当我请求它时:
$val=$Env:Name
它只返回空数据。据我所知,这是检索数据的正确方法。尝试使用点。而不是:
$val=$Env.Name
具有相同的结果。。。我一直在执行以下操作:步骤1,停止使用变量名
$env
,当您使用
$env:name
时,它是一个特殊变量,在
env:
的PSDrive中查找名为
name
的项。请更改变量名,然后重试。
$EnvObj = @(Get-WMIObject -Class Win32_Environment -ComputerName $Computer -EA Stop) 
$EnvObj[0] | Get-Member

   TypeName: System.Management.ManagementObject#root\cimv2\Win32_Environment

Name                MemberType    Definition                             
----                ----------    ----------                             
PSComputerName      AliasProperty PSComputerName = __SERVER              
Caption             Property      string Caption {get;set;}              
Description         Property      string Description {get;set;}          
InstallDate         Property      string InstallDate {get;set;}          
Name                Property      string Name {get;set;}                 
Status              Property      string Status {get;set;}               
SystemVariable      Property      bool SystemVariable {get;set;}         
UserName            Property      string UserName {get;set;}             
VariableValue       Property      string VariableValue {get;set;}        
__CLASS             Property      string __CLASS {get;set;}              
__DERIVATION        Property      string[] __DERIVATION {get;set;}       
__DYNASTY           Property      string __DYNASTY {get;set;}            
__GENUS             Property      int __GENUS {get;set;}                 
__NAMESPACE         Property      string __NAMESPACE {get;set;}          
__PATH              Property      string __PATH {get;set;}               
__PROPERTY_COUNT    Property      int __PROPERTY_COUNT {get;set;}        
__RELPATH           Property      string __RELPATH {get;set;}            
__SERVER            Property      string __SERVER {get;set;}             
__SUPERCLASS        Property      string __SUPERCLASS {get;set;}         
PSStatus            PropertySet   PSStatus {Status, Name, SystemVariable}
ConvertFromDateTime ScriptMethod  System.Object ConvertFromDateTime();   
ConvertToDateTime   ScriptMethod  System.Object ConvertToDateTime();    
$EnvLookup = $EnvObj | Where-Object {$_.Name -eq $Name}
$res = $EnvLookup.VariableValue