【问题标题】:'get-ciminstance win32_userprofile -CimSession | select' WITHIN DO & SWITCH statements doesn't work'get-ciminstance win32_userprofile -CimSession | select' WITHIN DO & SWITCH 语句不起作用
【发布时间】:2021-08-29 19:08:30
【问题描述】:

下面的 Cmdlet 可以正常工作,但在底部代码块中的 doswitch 语句中什么都不做?在 ISE 中进行调试不会提供任何帮助。删除| Select-Object 确实使它起作用,但产生了太多信息。删除 -CimSession $hostname 确实使它起作用。所以问题似乎与远程 PC 和/或 SELECT 语句有关。

Get-CimInstance Win32_UserProfile -CimSession $hostname | Select-Object -Property LocalPath, LastUseTime

function Show-Menu {
    Write-Host "
    1)Option A
    2)Option B
    3)User Profiles of Remote PC
    "}
DO {Show-Menu
    $UserChoice = Read-Host "Enter # of tool you want to run"
    $hostname=Read-Host "enter hostname"
    switch ($UserChoice) {
        1 {'You choose opt1'}
        2 {'You choose opt2'}
        3 {Get-CimInstance Win32_UserProfile -CimSession $hostname | Select-Object -Property LocalPath, LastUseTime}
   }
} UNTIL ($hostname -eq '')
  • 此 cmdlet 存在相同问题:{Get-WMIObject Win32_UserProfile -ComputerName $hostname | Select-Object -Property LocalPath,LastUseTime}
  • 有效,但间隔很有趣:{Get-WMIObject Win32_UserProfile -ComputerName $hostname | Format-List LocalPath, LastUseTime}
  • 有效,但间隔很有趣并且有奇怪的 runspaceID 项目:{Invoke-Command -ComputerName $hostname -HideComputerName -ScriptBlock {Get-WMIObject Win32_UserProfile | Select-Object LocalPath, LastUseTime}}

【问题讨论】:

  • 那是因为你指向一个不存在的cimsession。首先创建 cim 会话,然后针对它运行它,或者只是将参数交换为 -ComuterName。我会将-eq 换成-ne $null
  • @AbrahamZinala 你是什么意思不存在的会话?我如何首先创建它?将其更改为 -ComputerName $hostname 有同样的问题。知道为什么 Format-List 有效,但 Select-Object 无效?
  • @js2010 修复了丢失的大括号,这是一个糟糕的复制/粘贴,它在原始代码中并不是原因。语法错误和最后一句话是什么意思?我是 powershell 和脚本的新手
  • 我将它切换到-NotContains,因为我不断遇到-eq-ne 的问题。

标签: powershell powershell-remoting get-wmiobject select-object


【解决方案1】:

您的代码存在语法错误,并且缺少用于关闭开关的大括号。将文本输出与对象输出混合会导致 powershell 出现问题。例如,这很好用。

function Show-Menu {Write-Host "
    1)Option A
    2)Option B
    3)User Profiles of Remote PC
"}

DO {
#    Show-Menu
#    $UserChoice = Read-Host "Enter # of tool you want to run"
#    $hostname=Read-Host "enter hostname"

  $hostname = 'comp001'
  switch (3) {
        1 {'You choose opt1'}
        2 {'You choose opt2'}
        3 {Get-CimInstance Win32_UserProfile -CimSession $hostname | 
             Select-Object -Property LocalPath, LastUseTime}
  }
} UNTIL (1) 

【讨论】:

  • 当您的代码有效时,我需要提示输入主机名,这就是它失败的时候。主机名用户输入变量填充是否错误&我的问题?你可以更新你的代码来做你认为合适的吗?
  • 我根本不会使用提示。只需要一个带有你想要的选项的函数,并且只显示 get-ciminstance 输出。
【解决方案2】:

正如我所提到的,没有建立 cimsession 供您指出。所以,让我们使用New-CimSession$hostname 中提供的计算机名称来创建它。

function Show-Menu 
{
Write-Host "
    1)Option A
    2)Option B
    3)User Profiles of Remote PC
"
}

Do {

    Show-Menu
    $User_Choice = Read-Host -Prompt "Enter # of tool you want to run"
        switch ($User_Choice) {

            1 {'You choose opt1'}
            2 {'You choose opt2'}
            3 {

                $hostname = Read-Host -Prompt "Enter Computer Name"
                    if ([string]::IsNullOrEmpty($hostname) -eq $true) {
                        "No Computer Name was specified";
                        Break
                    }

                    try {
                        
                        $CIMSession = New-CimSession -ComputerName $hostname -ErrorAction stop

                        Get-CimInstance -ClassName Win32_UserProfile -CimSession $CIMSession | Select-Object -Property LocalPath, LastUseTime 

                    }
                    Catch [Microsoft.Management.Infrastructure.CimException] {
                        $Error[0].Message.Split('.')[1].Trim()

                    }
                    Finally {
                        if (Get-CimSession) {
                            Get-CimSession | Remove-CimSession
                            
                        }
                    } 
                }
        }

} Until ($User_Choice -notcontains '')

除了一些小的语法问题外,您应该在#3 选择中包含$hostname 提示符。除非,您也想将该变量用于其他选择。当然,您需要一些错误处理,以防连接到机器时发生错误,我们可以使用 try{}catch{} 块来做;为 cimsessions 清理添加了一个 finally{} 块。

【讨论】:

  • 这也让我感到惊讶,但它可以在没有 new-cimsession 的情况下工作。
  • @js2010,刚试过,我猜是的。这很奇怪。如果未指定 -computername ,它会从 MSDocs 中读取它创建一个本地 cim 会话。猜猜它也适用于远程计算机?奇怪的东西哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多