【问题标题】:Powershell error, issue specifying pathways/drivesPowershell 错误,指定路径/​​驱动器的问题
【发布时间】:2017-09-18 18:53:50
【问题描述】:

我遇到了一个奇怪的错误。当我运行以下内容时,它在下面给了我这个错误。 $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

【问题讨论】:

  • 使用另一个斜杠,那些是前斜杠/,windows中的路径使用反斜杠\
  • 大多数在 Windows 中使用路径名的上下文都采用/` as the path separator; cmd.exe`,因为它使用/ 而不是- 作为切换指示器。
  • 就输出 csv 被放入输入文件夹而言,它完全按照您的指示进行操作。
  • @JeffZeitlin 不幸的是,将“/”更改为“\”给出了同样的错误..
  • @MacroPower - 是的,Select-Object -Property * 也可以工作,也很有用。

标签: powershell csv path import-csv


【解决方案1】:

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

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

Get-Help about_pipelines 提供了有关 PowerShell 管道的良好信息。您还可以通过管道将其发送到Get-Member 来了解特定 PowerShell 对象的结构。

【讨论】:

    【解决方案2】:

    这些命令:

    $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 的第二次执行将停止并提示确认覆盖现有文件。

    【讨论】:

    • Export-Csv 当然可以使用-Append 开关附加到现有文件;请参阅此评论中命令名称的链接。
    • 另外,$outputpath 不是一个文件对象,而是一个字符串;因此,它不需要任何成员引用来将输出放置在需要的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多