使用 Powershell 脚本将文件复制到 CSV 文件中声明的特定文件夹

Copying files to specific folder declared in a CSV file using Powershell Script

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

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

我还建议通常为您的 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-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

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