如何在powershell的变量中执行字符串

Posted

技术标签:

【中文标题】如何在powershell的变量中执行字符串【英文标题】:How to execute a string in a variable in 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。

【问题讨论】:

【参考方案1】:

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

$commandString = '"C:\ProgramData\Package Cache6b95042e-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。所以除非我遗漏了什么,否则这个细节与这段代码的工作方式没有任何关系。

【讨论】:

以上是关于如何在powershell的变量中执行字符串的主要内容,如果未能解决你的问题,请参考以下文章

在powershell中展平数组

在 Powershell 中,如何通过提供名称作为 $var 来设置环境变量?

如何在 PowerShell 中连接字符串和变量?

PowerShell 语法

如何使用批处理或PowerShell从文本文件中删除换行符

为自动执行设置 PowerShell 脚本