Powershell 错误,问题指定 pathways/drives
Powershell error, issue specifying pathways/drives
我收到一个奇怪的错误。当我在下面 运行 时,它在下面给了我这个错误。来自 $inputfolder 的文件名是正确的,但文件路径已更改为 当前驱动器 ,而不是我定义为 $inputfolder 的路径。这就是为什么 "cannot find the file."
找不到文件 'C:\path\of\current\drive\batch.csv'。
当我将我的 .ps1 移动到 $input 文件夹时,它起作用了。我不知道我做错了什么。定义了变量。
还有,$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
Get-ChildItem
returns 一组(在本例中,因为您正在查看文件系统)文件 objects,而不是文件 名字。当您将文件对象数组传递给 Import-CSV
(或 Get-Content
)时,它使用 Name
属性,它 而不是 包括路径。如果没有路径,它假定您希望在当前目录中查找。解决方案是不传递 $inputobject
,而是传递 $inputobject.fullname
,其中包括文件对象的路径。
这是熟悉基于文本的界面(例如 CMD.EXE
或各种 UNIX/Linux shell(例如 bash
)的人的常见误解。那些较旧的 shell 通过管道传递文本; PowerShell 传递实际对象,您需要知道传入数据的实际结构。
Get-Help about_pipelines
. You can also find out about the structure of a particular PowerShell object by piping it to Get-Member
.
提供了有关 PowerShell 管道的有用信息
这些命令:
$inputfolder = 'C:/path/to/folder/'
$inputobject = Get-ChildItem $inputfolder
returns 目录 '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 不能 "Append" 到现有文件,所以要么你必须指定 -Force 给它,这样你就会得到最后一个文件处理的结果,或者你必须确定 $inputobject集合只包含一个文件,否则第二次执行 Export-CSV 将停止并提示确认是否覆盖现有文件。
我收到一个奇怪的错误。当我在下面 运行 时,它在下面给了我这个错误。来自 $inputfolder 的文件名是正确的,但文件路径已更改为 当前驱动器 ,而不是我定义为 $inputfolder 的路径。这就是为什么 "cannot find the file."
找不到文件 'C:\path\of\current\drive\batch.csv'。
当我将我的 .ps1 移动到 $input 文件夹时,它起作用了。我不知道我做错了什么。定义了变量。 还有,$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
Get-ChildItem
returns 一组(在本例中,因为您正在查看文件系统)文件 objects,而不是文件 名字。当您将文件对象数组传递给 Import-CSV
(或 Get-Content
)时,它使用 Name
属性,它 而不是 包括路径。如果没有路径,它假定您希望在当前目录中查找。解决方案是不传递 $inputobject
,而是传递 $inputobject.fullname
,其中包括文件对象的路径。
这是熟悉基于文本的界面(例如 CMD.EXE
或各种 UNIX/Linux shell(例如 bash
)的人的常见误解。那些较旧的 shell 通过管道传递文本; PowerShell 传递实际对象,您需要知道传入数据的实际结构。
Get-Help about_pipelines
. You can also find out about the structure of a particular PowerShell object by piping it to Get-Member
.
这些命令:
$inputfolder = 'C:/path/to/folder/'
$inputobject = Get-ChildItem $inputfolder
returns 目录 '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 不能 "Append" 到现有文件,所以要么你必须指定 -Force 给它,这样你就会得到最后一个文件处理的结果,或者你必须确定 $inputobject集合只包含一个文件,否则第二次执行 Export-CSV 将停止并提示确认是否覆盖现有文件。