You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:33:21