Import-Csv和Export-Csv具有相同的名称和路径

时间:2018-01-18 16:41:15

标签: powershell csv

这应该是一个相当简单的问题,但我还没有能够在线找到资源。我需要删除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正在读取文件并且不能同时导出文件的问题是什么?我应该尝试将导入的数据设置为变量,然后在import-csv管道外导出csv吗?

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

2 个答案:

答案 0 :(得分:2)

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

尝试:

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

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

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

答案 1 :(得分:1)

使用$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

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

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

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