【问题标题】:Powershell Copy-Item Foreach from text file with folder paths and environment variables带有文件夹路径和环境变量的文本文件中的 Powershell Copy-Item Foreach
【发布时间】:2018-07-31 07:21:36
【问题描述】:

我正在使用一个包含文件和文件夹路径列表的文本文件,我想将这些路径复制到某个 $destination。我试图让 powershell 将每一行解释为复制项的文件路径。这是我正在使用的:

$cfglist = Get-Content "${cfgPath}\ProgramConfigsList.txt"
    Foreach($item in $cfglist){
    #Copy-Item -Path $item -Destination $dst -Force -Recurse -Container:$true -Passthru -Whatif
}

ProgramConfigsList.txt 如下所示:

"$env:programfiles\Tracker Software\PDF Editor\Dictionaries"
"${env:ProgramFiles(x86)}\Notepad++\plugins"
"$env:userprofile\AppData\Local\ATI"

等等。

我收到此错误:复制项:找不到驱动器。名为“$env”的驱动器不存在。

在文本文件中,我尝试使用引号,不使用引号,并使用 ` 取消注释“:”。在 PS 脚本中,我有 $item、“$item”、“${item}”和 ${item}。我还尝试使用相同的 copy-item 命令将 $cfglist 变量传递到 foreach-object 脚本块。我尝试过使用“get-childitem”的变体,但这似乎不适用于需要解释为文件/文件夹路径的文本文件中的条目。我还从 ps1 脚本内的 ProgramConfigsList.txt 中的条目创建了一个数组,但遇到了同样的错误。

有什么建议吗?

【问题讨论】:

  • 您可以将每个字符串对象传递给 Invoke-Expression,它会将字符串扩展为路径。您最好确保该文件不会被篡改,因为任何可以编辑它的人都可以在您的系统上运行 PowerShell。
  • 命令是:Get-Content "${cfgPath}\ProgramConfigsList.txt" | ForEach-Object { 调用表达式 $_ }
  • 虽然这在这种情况下会起作用,但我建议 not (ab)使用 Invoke-Expression 单独进行字符串扩展。如果有人在你的阅读文件中放了一些讨厌的东西怎么办? :-|
  • 永远不要忘记小鲍比桌...xkcd.com/327
  • 我建议在您的输入文件中使用%environmentvariablename% 语法;那么你可以简单地在 PowerShell 中使用 [Environment]::ExpandEnvironmentVariables 并完成它。

标签: powershell foreach


【解决方案1】:

您需要删除包含引号,然后手动展开变量:

$cfglist = Get-Content "${cfgPath}\ProgramConfigsList.txt" |ForEach-Object {
    $ExecutionContext.InvokeCommand.ExpandString($_.Trim("`"'"))
}

【讨论】:

    【解决方案2】:

    或者:在输入文件中使用%variablename% 语法并使用[Environment]::ExpandEnvironmentVariables 静态方法。示例:

    Get-Content "$cfgPath\ProgramConfigsList.txt" | ForEach-Object {
      [Environment]::ExpandEnvironmentVariables($_)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2012-09-30
      相关资源
      最近更新 更多