使用 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
希望能给您一些其他的想法!欢迎来到堆栈溢出。
我是 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
希望能给您一些其他的想法!欢迎来到堆栈溢出。