【发布时间】: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