【问题标题】:Import-Csv and Export-Csv with same name and path具有相同名称和路径的 Import-Csv 和 Export-Csv
【发布时间】:2018-06-27 19:37:58
【问题描述】:

这应该是一个相当简单的问题来回答,但我一直无法在网上找到资源。我需要在不更改文件名或路径的情况下从 csv 中删除行。目前我正在尝试导入文件,过滤我需要的项目并将该数据导出到具有相同文件名的相同位置:

foreach ($csv in $csvLists){
Import-Csv $csv | Where-Object {[DateTime]$_.'Date' -ge $2WeeksOld} | Export-Csv $csv -NoType -Force
}

也试过了:

foreach ($csv in $csvLists){
Import-Csv $csv | Where-Object {[DateTime]$_.'Date' -ge $2WeeksOld} | Export-Csv $csv.PSParentPath -NoType -Force
}

我收到拒绝访问错误:

Export-Csv : Access to the path 'D:\Test' is denied.
At C:\script.ps1:20 char:71
+ ... .'Date' -ge $2WeeksOld} | Export-Csv $csv.PSParentPath -NoType -Force
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Export-Csv], UnauthorizedAccessException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ExportCsvCommand

我在这里缺少什么?是powershell正在读取文件并且无法同时导出的问题吗?我是否应该尝试将导入的数据设置为变量,然后将 csv 导出到 import-csv 管道之外?

一如既往地感谢您的帮助。

【问题讨论】:

  • 您是否碰巧在应用中查看该文件?
  • 没关系,错误看起来像您被拒绝访问该文件夹。你有那个文件夹的写权限吗?
  • 为什么是$csv.PSParentPath?使用$csv.Fullname 是否可以解决问题?
  • @gms0ulman 我的印象是 $csv 将包含文件名,而 PSParentPath 将提供路径,不知道为什么我不只是使用 Fullname 开头!这有效,请提供您的回复作为答案,我会确认。您是否有更多关于如何正确使用 PSParentPath 的信息?我想我可能用错了。
  • $csv.PSParentPath 确实包含FileInfo 对象的目录,但大多数人会使用$csv.DirectoryName 或$csv.Directory.FullName。但是,如果$Csv 是C:\Test\File.csv,那么Export-Csv -Path $Csv.PSParentPath 将尝试在C:\ 中创建一个名为Test 的文件。那是行不通的。 NTFS 不允许在同一文件夹中具有相同名称的对象。

标签: powershell csv


【解决方案1】:

这里的问题是您试图在一行中完成所有事情,因此您正在打开一个文件(锁定它)并试图同时覆盖同一个文件(需要锁定它) .那是行不通的。

试试:

foreach ($csv in $csvLists){
    $Data = Import-Csv $csv | Where-Object {[DateTime]$_.'Date' -ge $2WeeksOld}
    $Data | Export-Csv $csv -NoType -Force
}

或者,如果$csvLists 是FileInfo 对象的数组(例如来自Get-ChildItem 的输出):

foreach ($csv in $csvLists){
    $Data = Import-Csv $csv.FullName | Where-Object {[DateTime]$_.'Date' -ge $2WeeksOld}
    $Data | Export-Csv $csv.FullName -NoType -Force
}

【讨论】:

  • 感谢您的建议,这基本上是我在问题的最后一点所建议的。这可行,尽管它添加了一个额外的变量和行。我认为在这种情况下,@gms0ulman 的回复对我来说会更好。
【解决方案2】:

使用$csv.FullName。这包含文件/文件夹的完整路径。
以下是System.IO.FileInfo的几个常见属性:

Property        Contents
BaseName        MyFile
Directory*      <returns System.IO.DirectoryInfo object of "C:\Path\To">
Name            MyFile.txt
FullName        C:\Path\To\MyFile.txt
PSParentPath    Microsoft.PowerShell.Core\FileSystem::C:\Path\To

我不知道.PSParentPath 的用例。查看内容,我假设它在您需要指定 PSProvider 以及父级的字符串值时使用。否则你可以使用.Directory.Name

您可能会发现 FileInfo 和 DirectoryInfo 的类定义很有用。它们是Get-ChildItem 返回的对象。链接列出方法和属性;他们没有列出 Code/Note/ScriptProperty 类型。

提示: 运行 $csv | Get-Member 以查看此对象的成员,查看 MemberType。

* 对于 System.IO.DirectoryInfo 对象,使用 Parent。在 Win10 中有一些不同的行为,并且确信引入了一个别名,以便 Parent 适用于 FileInfo 或 Directory 适用于 DirectoryInfo。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2017-10-19
    • 2012-06-01
    • 2018-06-03
    • 2013-02-16
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多