0

我收到一个奇怪的错误。当我运行以下内容时,它在下面给了我这个错误。$inputfolder 中的文件名是正确的,但文件路径更改为当前驱动器,而不是我定义为 $inputfolder 的路径。这就是它“找不到文件”的原因。

找不到文件“C:\path\of\current\drive\batch.csv”。

当我将 .ps1 移动到 $inputfolder 时,它可以工作。我不知道我做错了什么。定义了变量。 此外, $outputpath 不起作用。done.csv 文件在输入文件夹中创建。

$inputfolder = 'C:/path/to/folder/'
$inputobject = Get-ChildItem $inputfolder
$outputpath = Join-Path $inputfolder 'done.csv'
Import-Csv $inputobject | select COLUMN1,COLUMN1 | Export-Csv -Path $outputpath -NoTypeInformation

编辑:完整的错误报告;同样,“path\of\current\drive”是我拥有 .ps1 所在文件夹的位置,即使我定义了我的变量,它也只有在我将 .ps1 移动到 $inputfolder 时才能正常工作。

Import-Csv : Could not find file 'C:\path\of\current\drive\batch.csv'.
At C:\path\of\current\drive\myscript.ps1:9 char:1
+ Import-Csv $inputobject | select COLUMN1,COLUMN2 | Export-Cs ...
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Import-Csv], FileNotFoundException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand
4

2 回答 2

2

Get-ChildItem返回一组(在这种情况下,因为您正在查看文件系统)文件对象,而不是文件。当您将文件对象数组传递给Import-CSV(或Get-Content)时,它使用包括路径的Name属性。如果没有路径,则假定您希望查看当前目录。解决方案是传递 not , but ,其中包括文件对象的路径。$inputobject$inputobject.fullname

这是熟悉基于文本的界面(例如,CMD.EXE各种 UNIX/Linux shell,例如bash. 那些较旧的 shell 通过管道传递文本;PowerShell 传递实际对象,您需要了解传入数据的实际结构。

有关于 PowerShell 管道的好信息Get-Help about_pipelines。您还可以通过将特定 PowerShell 对象通过管道传输到Get-Member.

于 2017-04-21T20:26:31.457 回答
0

这些命令:

$inputfolder = 'C:/path/to/folder/'
$inputobject = Get-ChildItem $inputfolder

返回目录“C:/path/to/folder/”中的所有文件您确定要处理所有文件吗?也许甚至不是 .csv 文件?

我建议宁愿使用:

$inputfolder = 'C:/path/to/folder/'
$inputobject = Get-Item "$($inputfolder)*.csv"

这些将仅收集 csv 文件。

正如 Jeff 所写,您必须使用输入和输出对象的全名属性,因此您的最后一个命令应如下所示:

$inputobject | foreach-object {
Import-Csv $_.fullname | select COLUMN1,COLUMN1 | Export-Csv -Path $outputpath.fullname -NoTypeInformation}

请记住,您的 $onputobject 不是单个文件,而是文件集合!Export-CSV 不能“附加”到现有文件,因此您必须为其指定 -Force,这样您就可以处理最后一个文件的结果,或者您必须确保 $inputobject 集合包含只有一个文件,否则 Export-CSV 的第二次执行将停止并提示确认是否覆盖现有文件。

于 2017-04-22T08:03:20.843 回答