繁体   English   中英

在 cmd 上运行 powershell 命令

[英]run powershell command over cmd

I'm trying to run this powershell command over cmd.. it worked when i run it directly from powershell.. but when i try to run if from cmd i get errors

Powershell 命令:

(Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection'" -ComputerName localhost. ).Uninstall()

我如何运行它(cmd):

powershell.exe -Command (Get-WmiObject -Class Win32_Product -Filter Name='Symantec Endpoint Protection' -ComputerName localhost. ).Uninstall()

Output:

Get-WmiObject : Invalid query "select * from Win32_Product where Name=Symantec 
Endpoint Protection"
At line:1 char:2
+ (Get-WmiObject -Class Win32_Product -Filter Name='Symantec Endpoint P ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], Management 
   Exception
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.C 
   ommands.GetWmiObjectCommand
 
You cannot call a method on a null-valued expression.
At line:1 char:1
+ (Get-WmiObject -Class Win32_Product -Filter Name='Symantec Endpoint P ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

尝试这个:

powershell.exe -Command "& {(Get-WmiObject -Class Win32_Product -Filter """Name='Symantec Endpoint Protection'""" -ComputerName XOS-MS182. ).Uninstall()}"

试试这些。 括号对 cmd 有特殊意义。 过滤器需要两组引号。 由于 pipe 在双引号内,因此 cmd 忽略它。

powershell "(Get-WmiObject -Class Win32_Product -ComputerName localhost | where name -eq 'symantec endpoint protection').Uninstall()"
powershell "Get-WmiObject win32_product -cn localhost | ? name -eq 'symantec endpoint protection' | remove-wmiobject"

您不需要使用执行此任务,从提升的 Windows 命令提示符 ,您可以使用代替:

WMIC.exe Product Where "Name='Symantec Endpoint Protection'" Call Uninstall

其他答案已经回答了您在 CMD 上运行 powershell 的问题。 我想建议您停止使用 Win32_Product wmi class。 您可以阅读任何解释原因的永无止境的文章 至于使用 arguments 构建命令,我建议使用 splatting。 作为特别关于删除 SEP 的奖励,这里是用于使用 MSIexec 和 guid 删除 Symantec Endpoint 的生产脚本的片段。

$DateStamp = get-date -Format yyyyMMddTHHmmss
$logFile = '{0}-{1}-{2}.log' -f 'SymantecUninstall',$PC,$DateStamp
$locallog = join-path 'c:\windows\temp' -ChildPath $logFile

$uninstalljobs = Foreach($PC in $SomeList){

    start-job -name $pc -ScriptBlock {
    Param($PC,$locallog)
        $script = {
        Param($locallog)
        $MSIArguments = @(
            "/x"
            ('"{0}"' -f '{A0CFB412-0C01-4D2E-BAC9-3610AD36B4C8}')
            "/qn"
            "/norestart"
            "/L*v"
            $locallog
        )
        
        Start-Process "msiexec.exe" -ArgumentList $MSIArguments -Wait -NoNewWindow
        }
        Invoke-Command -ComputerName $pc -ArgumentList $locallog -ScriptBlock $script
    } -ArgumentList $PC,$locallog

}

只需更新指南以匹配您的产品。 如果您想从注册表中提取卸载字符串并使用它,它也比 Win32_Product 更可取。

您可以通过以下几种方法找到卸载字符串。

$script = {
    $ErrorActionPreference = 'stop'
    "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
    "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach{
        try
        {
            $key = reg query $_ /f "Symantec Endpoint" /s | select -skip 1 -first 1
            $key = $key -replace 'HKEY_LOCAL_MACHINE','HKLM:'
            (Get-ItemProperty $key -Name UninstallString).UninstallString
        }
        catch{}
    }
}
powershell.exe -command $script

或者

$script = {
    "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
    "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach{
        Get-childitem $_ |
            Where {($_ | get-itemproperty -Name displayname -ea 0).displayname -like 'Symantec Endpoint*'} |
            Get-ItemPropertyValue -name UninstallString
    }
}
powershell.exe -command $script

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM