Move-Item移动整个源目录而不是指定的文件

时间:2017-07-01 16:15:11

标签: powershell

在PowerShell中,我正在尝试使用Move-Item将包含位于$Source的字符串“2017”的所有文件移动到$MovieDst

我要在$Source中移动的文件是单独的.mkv个文件,文件名中包含字符串“2017”,位于$Source的根目录 - 它们不在。目录

如果我散列Move-Item并取消散列Write-Host $NoDirMovie,则会输出以下内容:

ExampleFile.2017.mkv
ExampleFile2.2017.mkv

因此,它肯定知道哪些是要引用的正确文件。但是,只要我使用Move-Item,它就会将整个$source directory移动到$MovieDst。我无法使用-Exclude *COMPLETED_DOWNLOADS*,因为它包含了我想要移动的文件。

所以,我有点卡住了 - 它无法移动我的文件,因为它首先要移动包含它们的整个目录。有没有办法阻止它移动整个$Source目录,并且只能移动包含字符串“2017”的$Source的内容?

$Source = "C:\TV Shows 7\COMPLETED_DOWNLOADS"
$MovieDst = "C:\TV Shows 7\COMPLETED DOWNLOADS_Sorted\MOVIES"
$NoDirMovies = dir $Source *2017*

foreach($NoDirMovie in $NoDirMovies | where {$_ -ne $Source})
{
Move-Item -Path $Source -Destination $MovieDst
#Write-Host $NoDirMovie
}

2 个答案:

答案 0 :(得分:1)

为什么要在$NoDirMovie中存储所需的文件,然后将$Source传递给Move-item

当然你想要:

foreach($NoDirMovie in $NoDirMovies | where {$_ -ne $Source})
{
    Move-Item -Path $NoDirMovie -Destination $MovieDst
    #Write-Host $NoDirMovie
}

修改

这是一个简单的解决方案,我还没有尝试过。一些事情:

  • dir是内置PowerShell Cmdlet的别名Get-ChildItem

  • 您的循环Where不合逻辑。 $NoDirMovies是目录$Source中的文件,因此它们永远不会等于$Source(假设这是尝试不复制目录?)

  • 值得检查您尝试复制的目录是否存在。

V2(我试过这个)

$Source   = "C:\TV Shows 7\COMPLETED_DOWNLOADS"
$MovieDst = "C:\TV Shows 7\COMPLETED DOWNLOADS_Sorted\MOVIES"
$filter   = "2017"

If(!(Test-Path $MovieDst)){
    New-Item -ItemType Directory -Path $MovieDst    
}

foreach($file in (Get-ChildItem $Source | Where-object {$_.Name -match $filter})){
    Move-Item -Path $file.FullName -Destination $MovieDst
}

答案 1 :(得分:0)

恕我直言,你的方法过于复杂。 Move-Item接受管道输入,所以

    @IBAction fund logoutDidTap(sender:Any){
    try! FirAuth.auth()?.signout()

var viewControllers = navigationController?.viewControllers
viewControllers?.removeLast(2) // views to pop
navigationController?.setViewControllers(viewControllers!, animated: true)
}

如果输出显示正常,请删除$Source = "C:\TV Shows 7\COMPLETED_DOWNLOADS" $MovieDst = "C:\TV Shows 7\COMPLETED DOWNLOADS_Sorted\MOVIES\" Get-ChildItem -Path $Source -Filter "*2017*.mkv" |Where {!($_.PSIsContainer)} Move-Item -Destination $MovieDst -WhatIf