【问题标题】:Parse csv data to create folders and record folder name解析csv数据创建文件夹并记录文件夹名称
【发布时间】:2017-06-06 23:42:02
【问题描述】:

您好,我正在尝试制作一个解析 csv 和 为每一行创建一个文件夹,然后将项目从 csv 中指定的路径复制到某个位置。目前我收到一条错误消息,提示无法将参数绑定到参数“路径”,因为它为空。有人可以帮忙吗

CSV Structure
FileLocation
K:\Folder\File

Powershell 内容

$csv = Import-Csv c:\export.csv


Foreach ($line in $csv){
    $inc = $i++
    mkdir $inc
    Copy-Item -Path $_.FileLocation -destination c:\users\bford.$inc -Recurse
    }

【问题讨论】:

  • $_.FileLocation -> $line.FileLocation

标签: powershell csv


【解决方案1】:

Mathias R. Jessen 在对该问题的评论中提供了关键指针:

foreach迭代变量$line,但尝试使用$_,但未定义 ($null) 在循环体内。

因此,将$_ 替换为$line 可以解决问题:

$csv = Import-Csv c:\export.csv

Foreach ($line in $csv){
    $inc = $i++
    mkdir $inc
    # $line is the iteration variable, not $_
    Copy-Item -Path $line.FileLocation -destination c:\users\bford.$inc -Recurse
}

自动变量 $_(又名$PSItem)仅由 PowerShell 在特定上下文中定义,例如在 管道 中,可用于传递给ForEach-Object cmdlet.

尽管ForEach-Object cmdlet 不幸命名为foreach alias,但它与foreach 语句不同:前者可以 - - 使用$_ ($PSItem),而后者必须使用选择的任何迭代变量(例如,在上面的例子中,$line)。

foreach 语句和 ForEach-Object cmdlet 之间进行选择归结为性能与内存使用:

  • 使用管道和ForEach-Object cmdlet 一次处理一个对象,保持内存使用不变,但会牺牲性能。 p>

  • 使用foreach 语句快速处理(通常)已加载到内存中的整体集合,但会消耗内存.

因此,与您的解决方案相比,速度较慢但内存效率更高且更简洁的等效方案是:

Import-Csv c:\export.csv | ForEach-Object {
  mkdir ($inc = $i++); Copy-Item -Path $_.FileLocation -destination c:\users\bford.$inc -Recurse
}

请注意,$i 在应用++ 时会隐式初始化为0,但最好先显式初始化它,您可以在单独的语句中执行此操作事前,或者在传递给ForEach-Object-Begin 块中,例如。


可选阅读:统一foreachForEach-Object相对于$_

虽然了解foreach 语句ForEach-Object cmdlet 的不同用例很重要,但标准化@987654354 的使用还是有价值的@:

issue I've created on GitHub 认为以下应该是可能的 - 但目前(v6 之前)不是:

# WISHFUL THINKING: without an explicit iteration variable, define $_
# implicitly, as with the ForEach-Object *cmdlet*.
foreach ($csv) {
  mkdir ($inc = $i++)
  Copy-Item -Path $_.FileLocation -destination c:\users\bford.$inc -Recurse
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2021-09-27
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多