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