【问题标题】:Expanding Environmental Variable using CSV file into Powershell script使用 CSV 文件将环境变量扩展为 Powershell 脚本
【发布时间】:2021-07-15 10:58:18
【问题描述】:

我正在尝试使用 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 文件备份

【问题讨论】:

  • 我们还没有收到您的来信.. 作为 SO 新手,您可能不知道这一点,但习惯上点击左侧的 图标 accept the answer that best solved your problem .这将有助于其他有类似问题的人更轻松地找到它,并有助于激发人们回答您的问题。

标签: powershell csv environment-variables robocopy


【解决方案1】:

由于您在 csv 中添加了一个路径为$env:LOCALAPPDATA\steam,并且知道您使用Import-Csv 从文件中读取的任何内容都是一个字符串,因此您需要使用正则表达式来转换@987654325 @ 到 %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 更安全

【讨论】:

  • 工作就像一个魅力。谢谢
  • @RakabAman 我很高兴听到它对您有用。如果您觉得我的回答解决了您的问题,请点击左侧的复选标记图标 考虑accepting。这将帮助其他有类似问题的人更轻松地找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2017-07-31
  • 2021-02-28
  • 2018-08-08
  • 2018-09-16
  • 2013-06-11
相关资源
最近更新 更多