【问题标题】:Copying files to specific folder declared in a CSV file using Powershell Script使用 Powershell 脚本将文件复制到 CSV 文件中声明的特定文件夹
【发布时间】:2020-03-17 21:55:20
【问题描述】:

我对 powershell 很陌生,我正在尝试制作一个脚本,将文件复制到在 CSV 文件中声明的某些文件夹。但到目前为止,我到处都遇到错误,找不到任何东西可以解决这个问题。

我在与脚本相同的文件夹中创建了这些文件夹和 .txt 文件。

到现在我只能这样做:

$files = Import-Csv .\files.csv 
$files
 foreach ($file in $files) {
    $name = $file.name
    $final = $file.destination
    Copy-Item $name -Destination $final   
  }

这是我的 CSV

name;destination
file1.txt;folderX
file2.txt;folderY
file3.txt;folderZ

【问题讨论】:

  • 欢迎来到 Stack Overflow。请使用tour 并阅读How to Ask。预计您自己的研究和代码尝试。编辑问题以包含您遇到的错误
  • 指定您的 csv 文件使用的分隔符 ;,因为这与默认的 逗号 不同。此外,您的 csv 缺少标题,因此也将它们添加到 cmdlet。试试$files = Import-Csv .\files.csv -Delimiter ';' -Header 'name' ,'destination'
  • 你的 csv 实际上有标题“名称”和“目的地”吗?
  • 谢谢你!我只需要 -Delimiter ";"
  • 很高兴能帮上忙!

标签: powershell csv copy-item


【解决方案1】:

如 cmets 所示,如果您不使用默认系统分隔符,则应确保指定它们。

我还建议通常为您的 csv 使用引号,以确保在不小心包含名称中包含分隔符的条目时不会出现问题。

@"
"taco1.txt";"C:\temp\taco2;.txt"
"@ | ConvertFrom-CSV -Delimiter ';' -Header @('file','destination')

会输出

file      destination
----      -----------
taco1.txt C:\temp\taco2;.txt

引号确保正确解释值。是的...您可以将文件命名为foobar;test..txt。永远不要低估用户可能会做什么。 ?

如果您使用命令Get-ChildItem | Select-Object BaseName,Directory | ConvertTo-CSV -NoTypeInformation 并查看输出,您应该会看到它是这样引用的。

寻找您的文件列表

最后一个提示。大多数时候,我都遇到过用于文件输入列表的 CSV,但并不需要 CSV。考虑在脚本本身中抓取文件。

例如,如果您有一个文件夹并且需要过滤列表,您可以在 PowerShell 中使用Get-ChildItem 轻松完成此操作。

例如:

$Directory = 'C:\temp'
$Destination = $ENV:TEMP
Get-ChildItem -Path $Directory -Filter *.txt -Recurse | Copy-Item -Destination $Destination

如果您需要更精细的匹配控制,请考虑使用Where-Object cmdlet 并执行以下操作:

Get-ChildItem -Path $Directory -Filter *.txt -Recurse | Where-Object Name -match '(taco)|(burrito)' | Copy-Item -Destination $Destination

您通常会发现您可以轻松地使用这种类型的过滤来将 CSV 和输入文件排除在解决方案之外。

示例

使用这样的技术,您可能能够从 2 个目录中获取文件,过滤匹配项,然后在这样的简短语句中复制所有文件:

Get-ChildItem -Path 'C:\temp' -Filter '*.xlsx' -Recurse | Where-Object Name -match 'taco' | Copy-Item -Destination $ENV:TEMP -Verbose

希望能给你一些其他的想法!欢迎来到堆栈溢出。 ?

【讨论】: