我在一个包含许多子文件夹的父文件夹中有一堆文件。我有一个文件,其中包含我需要复制到目标文件夹的特定文件的路径。
为了计算命令语法,我创建了一个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
有什么问题?
答案 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会根据需要将其提升为一个元素字符串数组。管道输入信息告诉我们它接受输入对象ByValue
和ByPropertyName
,即对象具有与该参数名称对应的属性名称。事实证明,PowerShell还会将属性与任何参数别名进行匹配,PSPath
是LiteralPath
参数的别名。这是如何将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($_)}
管道阶段将过滤掉恰好位于文件中的任何空行或空白行。