将特定文件移动到特定文件夹

时间:2016-03-31 20:01:17

标签: powershell

我在.txt文档中有一个XML文件名列表(包括该文件的完整路径):

C:\Files\www_site1_com\order\placed\test45.xml
C:\Files\www_site1_com\order\placed\test685.xml
C:\Files\www_site2_com\order\placed\test63.xml
C:\Files\www_site3_com\order\placed\test9965.xml
C:\Files\www_site4_com\order\placed\test4551.xml
etc...

我的想法是我需要将XML文件移动到另一个文件夹,例如:

C:\Files\www_site1_com\order\placed\test45.xml
    will be moved to
C:\Files\www_site1_com\order\in\test45.xml

C:\Files\www_site1_com\order\placed\test685.xml
   will be moved to
C:\Files\www_site1_com\order\in\test685.xml

问题是我不知道如何将每个文件实际移动到它应该进入的目标文件夹中。

以下是我的脚本中处理移动的部分。 第一部分获取XML文件列表,并将\ placement \替换为\ in \,以便最终得到目的地:

$content =  Get-Content dump.txt    
ForEach ($path in $content)
{
$path = $content -Split "\\t"
$paths = $path -notlike "*t*"
$paths = $paths -Replace ("placed","in")
}

最终给了我:

C:\Files\www_site1_com\order\in
C:\Files\www_site1_com\order\in
C:\Files\www_site2_com\order\in
C:\Files\www_site3_com\order\in
C:\Files\www_site4_com\order\in

接下来,移动我正在尝试的文件:

ForEach ($path in $paths)
{
Move-Item -Path $path -Destination $paths
}

但我最终会遇到各种错误:

Move-Item : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified method is not supported.
At line:3 char:36
+ Move-Item -Path $path -Destination $paths  -WhatIf
+                                    ~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Move-Item], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.MoveItemCommand

我尝试了一些变体,但只是设法将所有文件移动到第一个目标文件夹而不是正确的文件夹。 我希望我已经解释得这么好了!谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这一行:

$path = $content -Split "\\t"

生成一个字符串数组($ path也是一个字符串数组)。 -Destination参数不接受数组。它看起来也不是很强大(如果你的一个目录以t开头呢?)

而是使用Split-Path:

$sourceDirectories = $content | Split-Plath -Parent

然后,您可以通过离开父级并附加所需的目标目录来替换这些目录的叶子:

$destDirectories =  $sourceDirectories | Split-Path -Parent | Join-Path -ChildPath "in" 

然后你可以移动它们,但我会在一个循环中完成所有操作:

$content | foreach {
    $sourceDirectory = Split-Plath $_ -Parent
    $destDirectory = Split-Path $sourceDirectory -Parent | Join-Path -ChildPath "in"
    Move-Item $_ $destDirectory
}

答案 1 :(得分:0)

实际编辑文本文件内容似乎没有任何理由,因为move-item没有为您创建文件夹。如果你使用copy-item它可以根据需要创建文件夹,那么类似的东西可能会更好。不过尝试这样的事情:

$content =  Get-Content dump.txt

#If you want to explicitly create a particular directory
#New-Item -Name "in" -type directory

foreach($item in $content){
    $fileCheck = Test-Path $item

    if($fileCheck){
        try{
            Move-Item -LiteralPath $item -Destination "C:\Files\www_site1_com\order\in\" -PassThru
        }
        catch{
            write-error $_
        }
    }
    else{
        write-warning "$item was not found"
    }
}