Powershell 使用移动项进行飞溅会产生错误

Powershell 使用移动项进行飞溅会产生错误,powershell,powershell-4.0,Powershell,Powershell 4.0,好的,脚本本身有500多行,所以我不会发布整个内容。不过,我已将问题缩小到一行 如果我使用下面这行代码,一切都会按预期进行 Move-Item -Path $path -Include *.txt,*.doc,*.pdf -Destination $dest -Force 但当我将其更改为使用Splating时,它会给我一个错误 $downloadDir = "G:\Downloads" $dest = "G:\Test\" $editList = Get-ChildItem -Literal

好的,脚本本身有500多行,所以我不会发布整个内容。不过,我已将问题缩小到一行

如果我使用下面这行代码,一切都会按预期进行

Move-Item -Path $path -Include *.txt,*.doc,*.pdf -Destination $dest -Force
但当我将其更改为使用Splating时,它会给我一个错误

$downloadDir = "G:\Downloads"
$dest = "G:\Test\"
$editList = Get-ChildItem -LiteralPath "$downloadDir" -include "[" -File | ForEach-Object -Process {Rename-item -LiteralPath $_.FullName -NewName ($_.Name -replace "[][]"," ") -ErrorAction SilentlyContinue}
$mainList = Get-ChildItem -Path "$downloadDir" -File | Select-Object Name

ForEach ($list in $mainList) {
    $item = $list.Name
    $path = "$downloadDir\*"
    $opts = @{
        Path = $path;
        Include = '*.txt,*.doc,*.pdf';
        Force = $true;
        Destination = $dest
    }
    Move-Item @opts
}

Move-Item : Cannot move item because the item at 'G:\Downloads\test.txt' does not exist.
我觉得我可能遗漏了一些非常基本的东西,但我对哈希表/散列的了解还不够,无法发现错误

有什么想法吗

编辑: 只是想澄清一下,G:\Downloads\test.txt来自$path,它是从Get-ChildItem生成的

我实际上是在直接交换两个版本的代码(飞溅/非飞溅)

编辑2: 添加了与该移动项相关的脚本的所有部分

编辑3: 通过在“Include”行中使用双引号实现此功能:


将您的包含更改为:

  Include = '*.txt,*.doc,*.pdf';

Path语句也可能很棘手

比如说

get-childitem c:\temp -include *.txt 
不起作用,而

get-childitem c:\temp\* -include *.txt
如果您在c:\temp中有任何.txt文件,则可以使用


这很愚蠢,但对于某些cmdlet来说就是这样

将您的包含更改为:

  Include = '*.txt,*.doc,*.pdf';

Path语句也可能很棘手

比如说

get-childitem c:\temp -include *.txt 
不起作用,而

get-childitem c:\temp\* -include *.txt
如果您在c:\temp中有任何.txt文件,则可以使用



这很愚蠢,但对于某些cmdlet来说就是这样

哪个参数是
G:\Downloads\test.txt
?如果您直接在脚本中用splatted选项替换单行,那么这将失败?对不起,应该解释一下。基本上,“G:\Downloads\test.txt”来自$path,它是在脚本的这一部分之前生成的。基本上来自在G:\Downloads上运行的Get ChildItem。对交换时出现此错误。不确定这是否是问题所在,但
-Include
参数采用字符串数组,而不是包含逗号分隔项的字符串。尝试
Include='*.txt'、'*.doc'、'*.pdf''G:\Downloads\test.txt'是一个字符串,
getchilditem
生成一个
[FileInfo]
对象。您是否将
$Path
分配给FullName属性,或者这可能是由于PowerShell在splatting时错误地扩展了FileInfo对象造成的?您是否能够将
Path
参数和管道
$Path
排除到移动项cmdlet并使其正常工作?@TheMadTechnician可能在这里发现了一些问题。您是否可以包括实际为
$path
赋值的代码?还可以尝试在哈希表中为
Path
分配一个文本字符串,比如
@{Path='G:\Downloads\test.txt'}
,看看是否有效。这两个参数都有助于确定这是否是问题的根源。哪个参数是
G:\Downloads\test.txt
?如果您直接在脚本中用splatted选项替换单行,那么这将失败?对不起,应该解释一下。基本上,“G:\Downloads\test.txt”来自$path,它是在脚本的这一部分之前生成的。基本上来自在G:\Downloads上运行的Get ChildItem。对交换时出现此错误。不确定这是否是问题所在,但
-Include
参数采用字符串数组,而不是包含逗号分隔项的字符串。尝试
Include='*.txt'、'*.doc'、'*.pdf''G:\Downloads\test.txt'是一个字符串,
getchilditem
生成一个
[FileInfo]
对象。您是否将
$Path
分配给FullName属性,或者这可能是由于PowerShell在splatting时错误地扩展了FileInfo对象造成的?您是否能够将
Path
参数和管道
$Path
排除到移动项cmdlet并使其正常工作?@TheMadTechnician可能在这里发现了一些问题。您是否可以包括实际为
$path
赋值的代码?还可以尝试在哈希表中为
Path
分配一个文本字符串,比如
@{Path='G:\Downloads\test.txt'}
,看看是否有效。这两种方法都有助于确定这是否是问题的根源。虽然单引号不起作用,但它让我尝试使用双引号,它确实起了作用,因此感谢您的建议!呵呵!当我测试v5时,我认为它对我有效。那么,*是问题吗?我已经在使用*了,但是当我将“Include”改为
Include=“*.txt”、“*.doc”、“*.pdf”,它开始工作。另外,我目前使用的是v4,所以可能在处理方式上有点不同?很酷,谢谢更新。为了安全起见,我将把答案改为使用“”,虽然单引号不起作用,但它使我尝试使用双引号,这确实有效,因此感谢您的建议!呵呵!当我测试v5时,我认为它对我有效。那么,*是问题吗?我已经在使用*了,但是当我将“Include”改为
Include=“*.txt”、“*.doc”、“*.pdf”,它开始工作。另外,我目前使用的是v4,所以可能在处理方式上有点不同?很酷,谢谢更新。为了安全起见,我将把答案改为使用“”