如何使用PowerShell根据文件名移动文件?

如何使用PowerShell根据文件名移动文件?,powershell,Powershell,我是PowerShell的新手,在做一些事情 如何使用PowerShell根据文件名移动文件 将0001_ddmmyy_用户名[active1]\u L_kkkk.pdf移动到C:\Users\abc\London 移动到C:\Users\abc\rusia 将0001_ddmmyy_jim[active1]\u P_kkkk.pdf移动到C:\Users\abc\Poland 我使用以下代码将文件移动到名为London的文件夹中。如果文件名有任何带文本[kkk]的方括号,则失败 gci 'C:

我是PowerShell的新手,在做一些事情

如何使用PowerShell根据文件名移动文件

0001_ddmmyy_用户名[active1]\u L_kkkk.pdf
移动到C:\Users\abc\London
移动到C:\Users\abc\rusia
0001_ddmmyy_jim[active1]\u P_kkkk.pdf
移动到C:\Users\abc\Poland

我使用以下代码将文件移动到名为London的文件夹中。如果文件名有任何带文本[kkk]的方括号,则失败

gci 'C:\Users\abc' -Recurse -Include "*_L*" | %{ Move-Item $_.FullName 'C:\Users\abc\London'}
我如何实现自动化

  • 有多种方法:
  • 获取位置

    gci(获取位置).Path
    
    或者干脆
    \

    gci\
    
    此外,如果未指定任何路径,则gci将默认为当前路径。因此,以下内容将获取当前文件夹:

    gci
    
  • Move Item
    cmdlet中使用
    -LiteralPath
  • Move Item-LiteralPath$sourcePath$destinationPath
    
  • 我会做如下类似的事情:
  • #注意我使用了-File,所以它只返回文件
    $items=gci.\-递归-文件-包括*\u L*、*\u R*、*\u P*
    foreach($项目中的项目){
    #可以使用更干净/更好的东西,但这样就行了
    如果($item.Name-类似“*_L*”){
    移动项目-文字路径$Item'C:\Users\abc\London'
    }elseif($item.Name-类似“*\R*”){
    移动项目-LiteralPath$项目'C:\Users\abc\Russia'
    }elseif($item.Name-类似“*\u P*”){
    移动项目-LiteralPath$项目'C:\Users\abc\Poland'
    }否则{
    #意外输出
    写入主机“路径与预期不匹配”
    写入主机$item.Name
    }
    }
    
    Windows 10 64位。PowerShell 5

    如何使用PowerShell
    gci
    foreach
    if
    -如
    移动项目和
    -literalpath

    0001_ddmmyy_用户名[active1]\u L_kkkk.pdf移动到
    C:\Users\abc\London

    0001\u ddmmyy\u jacky[active1]\u R\kkkkk.pdf移动到
    C:\Users\abc\rusia

    0001_ddmmyy_jim[active1]\u P_kkkk.pdf移动到
    C:\Users\abc\Poland

    更改
    $env:userprofile\desktop
    。当您确信它可以工作时,请删除
    -whatif

    $items = gci -recurse -file *_L_*, *_R_*, *_P_*
    foreach($item in $items) {
      # Change $env:userprofile\desktop
      if($item -like "*_L_*") {
        Move-Item -LiteralPath $item "$env:userprofile\desktop\London" -whatif
      } elseif($item -like "*_R_*") {
        Move-Item -LiteralPath $item "$env:userprofile\desktop\Russia" -whatif
      } elseif ($item -like '*_P_*') {
        Move-Item -LiteralPath $item "$env:userprofile\desktop\Poland" -whatif 
      }
    } 
    
    评论:

    使用某些cmdlet时,如果使用
    -Path
    ,并且完整文件名的任何部分都包含[],则会得到奇怪的结果。修复方法是使用
    -LiteralPath
    参数。请参见获取帮助移动项目-参数*路径*
    –Lee_Dailey


    如何使用PowerShell gci、foreach基于文件基名移动文件,如果使用某些cmdlet时,-like、move item和-literalpath

    ,则当您使用
    -Path
    且完整文件名的任何部分包含
    []
    时,会得到奇怪的结果。其他一些角色也会发生这种情况,但我只记得这些。修复方法是使用
    -LiteralPath
    参数而不是
    -Path
    参数。您正在使用
    -Path
    参数,因为您没有指定任何内容,并且cmdlet默认为
    -Path
    。看一下
    Get Help Move Item-Parameter*path*
    的输出。你好,我的朋友,这段代码给我的输出与我的_L代码完全相同。当文件名在_L或_R或_P之前有一些带[xxxxxx]的文本时,它将不会移动它。你还可以建议创建文件夹London并将所有内容移动到其中。嘿,根据@somebadhat的回复,使用-LiteralPath将解决括号中的问题。他的解决方案工作得非常好,只需看一点小小的改进。1.检查并在中创建文件夹。如果文件存在,还可以跳过或覆盖。你好,我的朋友,它工作得很好,一个小的增加是有1个。如果文件夹不存在,请创建该文件夹,然后根据当前目录2移动该文件夹。检查是否存在同名文件,如果存在,请不要移动或替换它。非常感谢您的帮助help@CuriousEngineer在回答您的原始问题后,请不要添加新要求。而是通过单击✓ 如果您发现它解决了您的问题,请单击左侧的图标。然后发布一个新问题,明确说明附加要求。注意到了,很抱歉,因为我是新加入论坛的。@somebad我已经创建了一个新的线程。你能帮忙吗?@cur在你的新帖子上给我留言。