复制项路径错误

时间:2015-07-04 13:47:07

标签: powershell

我在一个包含许多子文件夹的父文件夹中有一堆文件。我有一个文件,其中包含我需要复制到目标文件夹的特定文件的路径。

为了计算命令语法,我创建了一个c:\powershellplay文件夹,其中包含Source和Dest文件夹,myfile.txt里面包含我正在测试的文件,如下所示。

c:\powershellplay\source\1.txt
c:\powershellplay\source\2.txt
c:\powershellplay\source\3.txt

我的命令是

Get-Content c:\powershellplay\myfile.txt | ForEach-Object {
  Copy-Item -Path $_.FullName -Destination "c:\powershellplay\dest"
}

我收到错误

Copy-Item : Cannot bind argument to parameter 'Path' because it is null.
At line:1 char:73
+ Get-content c:\powershellplay\myfile.txt|Foreach-Object{copy-item -path $_.FullN ...
+                                                                         ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Copy-Item], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand

$_.FullName有什么问题?

1 个答案:

答案 0 :(得分:3)

PetSerAl的评论是正确的。如果您查看Copy-Item -Path参数的帮助,您将看到:

Get-Help Copy-Item -Parameter Path

-Path <String[]>
    Specifies the path to the items to copy.

    Required?                    true
    Position?                    1
    Default value
    Accept pipeline input?       true (ByValue, ByPropertyName)
    Accept wildcard characters?  false

两个重要位是String[]Accept pipeline input类型。不要担心传入单个字符串,因为PowerShell会根据需要将其提升为一个元素字符串数组。管道输入信息告诉我们它接受输入对象ByValueByPropertyName,即对象具有与该参数名称对应的属性名称。事实证明,PowerShell还会将属性与任何参数别名进行匹配,PSPathLiteralPath参数的别名。这是如何将Get-ChildItem直接输出的FileInfo对象传递给Copy-Item(以及采用Path / LiteralPath的许多其他命令)。

在您的情况下,您可以依赖ByValue,而Copy-Item将使用您直接传递的字符串,例如:

Get-Content C:\powershellplay\myfile.txt | ? {![String]::IsNullOrWhiteSpace($_)} | 
    Copy-Item -Dest c:\powershellplay\dest

?{![String]::IsNullOrWhiteSpace($_)}管道阶段将过滤掉恰好位于文件中的任何空行或空白行。