powershell - 使用 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
解决方案
如注释所示,如果您不使用默认系统分隔符,则应确保指定它们。
我还建议通常为您的 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
希望能给你一些其他的想法!欢迎来到堆栈溢出。
推荐阅读
- python - 如何过滤掉由“os.listdir”产生的异常名称
- react-native - 如何在本机反应中从 s3 存储桶访问 .gz 文件
- vue.js - typeError object(...) 不是函数
- python - Python flask/django 面向对象的数据库使用
- node.js - 哪种数据模型更好?
- r - 如何从数据框创建矩阵?
- flutter - 如何在 Flutter Web 应用程序中拥有静态 HTML 站点?
- electron - IndexedDB 是否保存在文件中:Electron 中的协议?
- python - 从 VBA 运行 Python 脚本时无法导入 xlwings
- verilog - 我的课程和扩展代码有什么问题?