如何在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-Location
与 Set-Location
(别名为 cd
)类似,但它会跟踪您离开并作为堆栈输入的目录。它的兄弟 cmdlet Pop-Location
被进一步用于返回到之前的位置。
最后,我们使用Invoke-Expression
来运行您的命令。完成后使用Pop-Location
返回上一个目录。请记住以下几点:
您应该注意
Invoke-Expression
的使用通常是不安全地实现的,因此您应该考虑注意我链接到的文档中的警告,如果您的$commandString
实际上是从生成的文件,由参数或其他其他外部源提供。
注意:您在问题中提到了这一点:
第二行(注意没有exe)
Windows 不在乎您在执行它们时是否省略了可执行类型的扩展名。您可以在末尾使用或不使用.exe
运行AzInfoProtection.exe
。所以除非我遗漏了什么,否则这个细节与这段代码的工作方式没有任何关系。
【讨论】:
以上是关于如何在powershell的变量中执行字符串的主要内容,如果未能解决你的问题,请参考以下文章