【问题标题】:Powershell Get-NetAdapterAdvancedPropertyPowershell Get-NetAdapterAdvancedProperty
【发布时间】:2015-05-11 23:10:24
【问题描述】:

我正在尝试从批处理文件 test.bat 运行 Powershell 命令。我实际上是从 Python Popen 而不是从 test.bat 调用这个命令。(我使用 test.bat 只是为了验证)

powershell.exe (Get-NetAdapterAdvancedProperty -Name "SLOT 1" -DisplayName "Jumbo Packet").DisplayValue

相同的命令在没有第二个参数 -DisplayName "Jumbo Packet" 来自 python 和批处理的情况下工作

使用第二个参数时出现的错误如下:

Get-NetAdapterAdvancedProperty : 位置参数不能 发现接受参数“1”。在行:1 字符:2 + (Get-NetAdapterAdvancedProperty -Name SLOT 1 -DisplayName:Jumbo Packet).DisplayV ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Get-NetAdapterAdvancedProperty], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Get-NetAdapterAdvanc edProperty

* 但是,如果我从 Powershell 窗口运行相同的命令,我会得到预期的结果。

(Get-NetAdapterAdvancedProperty -Name "SLOT 1" -DisplayName "Jumbo Packet").DisplayValue

我是 Powershell 新手。感谢您的帮助

Python 代码:

 iface="SLOT 1"   
 cmd= 'powershell.exe (Get-NetAdapterAdvancedProperty -Name "'+ iface +'" -DisplayName "Jumbo Packet").DisplayValue'
 conn.modules.os.popen(cmd).read()

【问题讨论】:

    标签: windows powershell batch-file python-3.x powershell-3.0


    【解决方案1】:

    括号在命令中有特殊的含义。用插入符号逃脱它们。引号可能还需要用插入符号转义。

    但是为什么是间接的。 PS 使用 WMI。 WMI 也可通过 COM 获得。 Python 可以做 COM。

    这是 VBScript 拉出 nics。您应该能够使用任何支持 COM(几乎所有)的语言来执行此操作。

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    
    Set colItems = objWMIService.ExecQuery("Select * From Win32_NetworkAdaptor")
    
    For Each objItem in colItems
        msgbox objitem.name 
    Next
    

    【讨论】:

    • 谢谢@trigger ..我很抱歉,就像我说我是powershell的新手,甚至是python的新手。我正在尝试远程验证 NIC 适配器属性。我正在使用 rpyc 连接来连接到我的远程 Windows 机器。我必须检查如何获取远程机器的 objWMIService 对象。如果这是可以实现的,那么您的解决方案就很棒。它提供了更好的控制,而不是等待 powershell 输出。再次感谢
    • 'c = wmi.WMI(ip, user=user, password=pwd,find_classes=False) wql = "Select * From Win64_NetworkAdaptor" for item in c.query(wql): print item'我知道如何连接到 WMI。谢谢。我现在将查看 WMI API。
    • 在 VB 中,. 是计算机名称 (\\.\root\cimv2)。 . 表示本地计算机。您可以为. 输入任何计算机名称。
    • 从命令提示符使用类似wmic /node:"@%userprofile%\desktop\ComputerName.txt" /output:"%userprofile%\desktop\NicSpeed.html" /failfast:on nic where (PhysicalAdapter=TRUE and Speed!=100000000) get systemname,speed,caption /format:htable
    【解决方案2】:

    在整个命令字符串周围加上双引号(使整个命令成为 CMD 的字符串)。在双引号字符串中使用单引号来定义 PowerShell 的嵌套字符串:

    powershell.exe "Get-NetAdapterAdvancedProperty -Name 'SLOT 1' -DisplayName 'Jumbo Packet').DisplayValue"
    

    或者用反斜杠转义嵌套的双引号:

    powershell.exe "Get-NetAdapterAdvancedProperty -Name \"SLOT 1\" -DisplayName \"Jumbo Packet\").DisplayValue"
    

    但是,一般来说,简单地将 PowerShell 命令放入脚本中并使用 PowerShell 运行该脚本会更轻松:

    powershell.exe -File "C:\path\to\your.ps1"
    

    【讨论】:

    • 谢谢..这对我有用..没有试过你的conn.modules.subprocess.check_output(['powershell.exe','(Get-NetAdapterAdvancedProperty','-name "'+iface+'"','-DisplayName "Jumbo Packet").DisplayValue'])
    • @Arjun 然后发布您自己的答案。如果您的问题的解决方案隐藏在评论中,则对其他人没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多