如何在导入CSV的字符串中解析PowerShell环境变量参数?
问题描述
我在尝试使用从CSV中导入的字符串参数值时遇到了困难,试过几种方法都无法解析字符串中的参数。
我的CSV文本文件内容如下:
Name,Value XcomEnemyWithin,C:\Users\karee\OneDrive\Documents\my games\XCOM - Enemy Within Valheim,C:\Users\${env:UserName}\AppData\LocalLow\IronGate\Valheim
对应的备份脚本:
$backup_list = Import-Csv C:\backup_list.txt | Sort-Object -Property Name foreach ($backup_job in $backup_list.GetEnumerator()) { $this_job_name = $($backup_job.Name) $this_job_dir = $($backup_job.Value) Copy-Item -Path "$this_job_dir\" -Destination "C:\mybackups\$this_job_name" -Force -Recurse }
第一个任务运行正常,但第二个任务始终失败,因为路径字符串里的${env:UserName}无法被Copy-Item解析。想知道在这个工作流里,哪里可以解析这个字符串?
补充说明:我的问题曾被标记为重复,但我搜索了近一小时都没找到解决方案,后来才知道关键词是“Evaluate a string”,如果不知道准确关键词很难搜到,希望我的问题能帮助经验不足的开发者。
解决方案
要解析字符串中的PowerShell环境变量引用,你可以采用以下几种实用方法:
方法1:使用Invoke-Expression直接解析
在获取到路径字符串后,用Invoke-Expression执行字符串解析,替换其中的变量引用:
$this_job_dir = Invoke-Expression "`"$($backup_job.Value)`""
方法2:转换格式后用系统API展开环境变量
先把PowerShell风格的${env:UserName}转换成Windows标准环境变量格式%UserName%,再用[Environment]::ExpandEnvironmentVariables展开:
# 替换格式 $formattedPath = $backup_job.Value -replace '\${env:(\w+)}', '%$1%' # 展开环境变量 $this_job_dir = [Environment]::ExpandEnvironmentVariables($formattedPath)
方法3:通过脚本块执行解析
将字符串包装成脚本块执行,实现变量解析:
$this_job_dir = & ([ScriptBlock]::Create("`"$($backup_job.Value)`""))
优化后的完整脚本
另外,原脚本中$backup_list.GetEnumerator()属于多余操作,Import-Csv返回的是对象数组,直接遍历即可:
$backup_list = Import-Csv C:\backup_list.txt | Sort-Object -Property Name foreach ($backup_job in $backup_list) { $this_job_name = $backup_job.Name # 这里选用其中一种解析方法即可 $this_job_dir = Invoke-Expression "`"$($backup_job.Value)`"" Copy-Item -Path "$this_job_dir\" -Destination "C:\mybackups\$this_job_name" -Force -Recurse }
内容的提问来源于stack exchange,提问作者Kareem
相关产品推荐
相关产品推荐

