Powershell 使用移动项进行飞溅会产生错误
好的,脚本本身有500多行,所以我不会发布整个内容。不过,我已将问题缩小到一行 如果我使用下面这行代码,一切都会按预期进行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
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,所以可能在处理方式上有点不同?很酷,谢谢更新。为了安全起见,我将把答案改为使用“”