首页 > 解决方案 > 使用 Powershell 脚本将文件复制到 CSV 文件中声明的特定文件夹

问题描述

我对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

标签: powershellcsvcopy-item

解决方案


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

我还建议通常为您的 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。考虑在脚本本身中获取文件。

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

例如:

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

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

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

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


推荐阅读