【问题标题】:How to execute a string in a variable in powershell如何在powershell的变量中执行字符串
【发布时间】:2021-10-11 01:06:35
【问题描述】:

我有以下字符串

"C:\ProgramData\Package 缓存{6b95042e-f763-4850-9136-d004dd0d0a9b}\AzInfoProtection.exe" /卸载

我需要如下执行上面的字符串

一线

cd C:\ProgramData\Package Cache\{6b95042e-f763-4850-9136-d004dd0d0a9b}

第二行(注意没有exe)

AzInfoProtection /uninstall

变量通常在 PowerShell 中执行如下所示

Invoke-Expression $cmd

但是如何将上面的字符串拆分成多行执行。然后我需要删除引号,然后是 exe。

【问题讨论】:

    标签: powershell cmd scripting powershell-4.0


    【解决方案1】:

    这里的问题有点难以理解,但我想我明白了。让我知道我是否离题或误解了您要做什么。

    $commandString = '"C:\ProgramData\Package Cache{6b95042e-f763-4850-9136-d004dd0d0a9b}\AzInfoProtection.exe" /uninstall'
    
    # Get command parent directory
    if( $commandString -match '^".*?"' ) {
      $runInDir = Split-Path -Parent $Matches[0]
    }
    
    # Change directories (use the location stack for easy traversal) 
    Push-Location $runInDir
    
    # Run program
    Invoke-Expression $commandString
    
    # Change back to previous directory
    Pop-Location
    
    

    这通过检查字符串是否以引号括起来的字符串开头(文件路径中不需要处理转义的引号),如果是,则从$Matches 对象中获取第一个匹配项。 $Matches 是一个自动变量,只要您使用 [-match operator][1] 获得 $True 结果,就会填充该变量。提取命令路径后,我们使用Split-Path 获取相对于文件路径的父容器。

    然后使用Push-Location 更改目录。 Push-LocationSet-Location(别名为 cd)类似,但它会跟踪您离开并作为堆栈输入的目录。它的兄弟 cmdlet Pop-Location 被进一步用于返回到之前的位置。

    最后,我们使用Invoke-Expression 来运行您的命令。完成后使用Pop-Location 返回上一个目录。请记住以下几点:

    您应该注意Invoke-Expression 的使用通常是不安全地实现的,因此您应该考虑注意我链接到的文档中的警告,如果您的$commandString 实际上是从生成的文件,由参数或其他其他外部源提供。


    注意:您在问题中提到了这一点:

    第二行(注意没有exe)

    Windows 不在乎您在执行它们时是否省略了可执行类型的扩展名。您可以在末尾使用或不使用.exe 运行AzInfoProtection.exe。所以除非我遗漏了什么,否则这个细节与这段代码的工作方式没有任何关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 2013-02-13
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多