1

我正在编写一个预定的脚本,它将图像(jpg)从一个位置移动到另一个位置。问题是父目录的名称是可变的,而最终目录是固定的。

如果 robocopy 会这样做,我会很高兴:robocopy C:\temp\pcbmodel**\defect c:\test**\defect*。但它没有

例如,这几乎可以工作:

foreach ($i in Get-ChildItem C:\temp\pcbmodel\*\*\defect -recurse)
{
if ($i.CreationTime -lt ($(Get-Date).AddMonths(0)))
{
    write $i.FullName
    Copy-Item $i.FullName C:\Test
}
}

问题是文件被复制到 c:\test 但 ** 路径不是。还有我需要的 * 路径,因为它会因每个客户而改变。

一些建议会很好,伯特

4

4 回答 4

2

这应该使您走上获得有效解决方案的正确道路。重要的部分是 Resolve-Path cmdlet,它采用 -Relative 参数:http ://technet.microsoft.com/en-us/library/hh849858.aspx 。new-Item -Force 只是告诉它在需要时创建一个文件夹结构。

# $OldRoot = 'Top-level of old files'
# $DestRoot = 'Top-level of destination'
# Go to old root so relative paths are correct
Set-Location $OldRoot
# Get all the images, then for each one...
Get-ChildItem -Recurse -Include "*.jpeg", "*.jpg" | 
ForEach-Object { 
        # Save full name to avoid issues later
        $Source = $_.FullName

        # Construct destination filename using relative path and destination root
        $Destination = '{0}\{1}' -f $DestRoot, (Resolve-Path -Relative -Path:$Source).TrimStart('.\')

        # If new destination doesn't exist, create it
        If(-Not (Test-Path ($DestDir = Split-Path -Parent -Path:$Destination))) { 
            New-Item -Type:Directory -Path:$DestDir -Force -Verbose 
        }

        # Copy old item to new destination
        Copy-Item -Path:$Source -Destination:$Destination -Verbose
}
于 2013-07-22T16:02:47.263 回答
0

另一个想法:不要在C: disk上尝试。它将永远需要。但是,如果您对某个路径中的每个目录和子目录都具有权限,并且子目录的数量不是很大,那么它应该可以工作。

我在 C: 上创建了一个目录“新目录”,并在该目录中创建了另一个“新目录”。和ofc,目录中的另一个“新目录”。最后我创建了一个名为“superduper.txt”的文件-> C:\New Directory\New Directory\New Directory\superduper.txt

(get-childitem C:\).FullName | where {(Get-ChildItem $_).FullName | where {(get-childitem $_ -Recurse).FullName -match "superduper"}}

结果:

C:\New Directory

我认为它不会很快,你需要其中 2 个来实现你的目标,我想它应该可以工作。

于 2013-07-23T08:56:25.007 回答
0

像这样的东西怎么样:

$step1 = get-childitem  C:\temp\pcbmodel\
$Else = #FILETYPE YOU DO NOT WANT
$step1 | foreach {get-childitem -recurse -exclude "Directories", $ELSE | where {$_.Creationtime -lt ($(get-date).Addmonths(0))} 
                 }

希望我做对了,这有帮助:)

编辑:使用-Exclude-Include参数,它们有很大帮助:)

EDIT2:Ofc,我过度阅读了一些东西,对于许多编辑感到抱歉 - 你只是在寻找 jpg 文件。

$step1 | foreach {get-childitem -recurse -include *.jpg, *.jpeg | where {$_.Creationtime -lt ($(get-date).Addmonths(0))} 
于 2013-07-22T13:49:02.370 回答
0

我正在尝试将所有子文件夹及其文件从一个文件夹复制到另一个文件夹,而不复制其父文件夹。

例如,在C:\test某些包含文件的子文件夹中,复制到D:\test而不是D:\test\test\subfolders.

于 2015-09-23T17:17:44.827 回答