如何解决使用 CSV 文件将环境变量扩展到 Powershell 脚本中
我正在尝试使用 csv 文件创建一个备份脚本,该文件将包含所有本地(将存储备份的位置)和备份(文件夹到备份)位置并运行 robocopy 以将文件从备份复制到本地文件夹。我想从用于默认文件夹(例如 env:APPDATA)的 csv 文件中导入环境变量作为用于备份用户文档或公共文档中的某些文件和文件夹的位置。当我直接使用 env 变量或在脚本中使用完整路径地址时,复制操作可以正常工作。
robocopy "&env:localappdata\steam" "$backup"
但是当从 csv 导入时,脚本不会将其视为 env 变量。 robocopy 显示错误,因为它选择了这样的位置
Source : C:\WINDOWS\system32\$env:LOCALAPPDATA\steam\
Dest : D:\backup\steam\
以下是我正在使用的完整代码。
$path = "$PSScriptRoot\backup\"
$locations = import-csv "$PSScriptRoot\backup\local.csv" -Delimiter "," -Header 'Local','Backup','Display' | Select-Object Local,Backup,display
foreach($location in $locations){
$source = $location.Local
$source = $source.ToString()
$destination = $location.Backup
$destination = $destination.tostring()
$Name = $location.Display
$Name = $name.tostring()
Write-host "Copying $Name,please wait...." -foregroundColor Yellow
robocopy "$destination" "$path$source" \s \e
}
我的 CSV 文件是这样的
Steam、$env:LOCALAPPDATA\steam、Steam 文件备份
解决方法
由于您在 csv 中添加了一个路径为 $env:LOCALAPPDATA\steam
,并且知道您使用 Import-Csv
从文件中读取的任何内容都是 string,因此您需要使用正则表达式将 $env:VARNAME
转换为 %VARNAME%
以便能够将该环境变量解析为路径。
代替
$source = $source.ToString()
这样做
$source = [Environment]::ExpandEnvironmentVariables(($source -replace '\$env:(\w+)','%$1%'))
$source
现在将有一个像 C:\Users\Aman\AppData\Local\Steam
对 $destination
执行相同的操作
正则表达式详情:
\$ Match the character “$” literally
env: Match the characters “env:” literally
( Match the regular expression below and capture its match into backreference number 1
\w Match a single character that is a “word character” (letters,digits,etc.)
+ Between one and unlimited times,as many times as possible,giving back as needed (greedy)
)
附言与在 "$path$source"
中那样将路径与字符串连接相结合,使用 Join-Path cmdlet 更安全
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。