【问题标题】:Moving All Files with a Certain Name (Sorting) WINDOWS 8移动具有特定名称的所有文件(排序)WINDOWS 8
【发布时间】:2013-11-02 04:51:08
【问题描述】:

好的,所以我有大量电子书和其他文件,我想按作者姓名将它们分类到文件夹中。我通常在 Linux 中执行此操作的方式不适用于我的 Windows 8 笔记本电脑。我一直在使用 Powershell,但是如果在 Python 中有更好的方法或使用 bash 脚本,我愿意使用能够以最简单的方式完成此操作的任何方法。我需要它递归地工作,因为有很多子文件夹(很多都是按类型排序的)。到目前为止我尝试过的是:

mkdir 'C:\Users\Amanda\Downloads\BOOKS\Peter Straub'
Copy-Item 'C:\Users\Amanda\Downloads\*Peter Straub*' -recurse `
'C:\Users\Amanda\Downloads\BOOKS\Peter Straub'

不幸的是,它只查找名为 peter straub 的目录。如果我将其更改为 ~\Downloads*Peter Straub*.* 它就不起作用。我尝试使用 -match 和 -contains 但它们也无法正常工作。我对 Windows 8 中的脚本编写相对较新,非常感谢任何人的帮助。我想实现 read-host -prompt 所以我不必每次运行它时都编辑脚本。而且我希望它实际上移动文件而不仅仅是复制但 Move-Item 没有递归选项。那么我能否以某种方式获得脚本副本,然后删除原件。我也试过这个:

$author = (read-host -prompt 'Enter Name')
mkdir 'C:\Users\Amanda\Downloads\BOOKS\$author'
Copy-Item 'C:\Users\Amanda\Downloads\*$author*.*' -Recurse | Remove-Item 

但这也不起作用。我很想让这样的东西在自动化批处理中工作。

所以基本上我想选择一个作者姓名,使用该作者姓名创建一个新目录,然后搜索包含该作者姓名的所有文件并将其移动到新目录中。

编辑:::: 所以基本上我结合了三个答案的建议和我得到的完美作品!这是有效的 .bat:

@echo off &setlocal
set /p "Author=Enter Name: "
md "%author%"
for /f "delims==" %%i in ('dir C:\Users\Amanda\Downloads /b /s^|find "%author%" /i') do (move "%%i" "C:\Users\Amanda\Downloads\BOOKS\%author%")

再次编辑: 所以我尝试了修改后的尝试让它接受空格:

@echo off &setlocal
set /p "Author=Please enter an Author: "
md "C:\Users\Amanda\Downloads\BOOKS\%author%"
for /f "delims==" %%i in ('dir C:\Users\Amanda\Downloads /b /s^|find "%author: =.%" /i') do (move "%%i" "C:\Users\Amanda\Downloads\BOOKS\%author%")

它在创建目录时可以正常工作,但它不会移动文件。

【问题讨论】:

    标签: windows powershell batch-file wildcard


    【解决方案1】:
    set /p author=Please enter an Author: 
    md "C:\Users\Amanda\Downloads\BOOKS\%author%"
    for /f "delims==" %%i in ('dir C:\Users\Amanda\Downloads /b /s^|findstr "%author: =*%"') do (move "%%i" "C:\Users\Amanda\Downloads\BOOKS\%author%"
    

    这应该可以。如果没有,请发表评论,以便我修复它。

    【讨论】:

    • 批量尝试或将 %% 替换为 % 用于命令行。如果对您有帮助,请标记为正确答案。
    • 要添加用户提示,只需添加这一行 set /p "Author=Enter Name: " 并将“Peter Straub”替换为 "%Author%"
    • 我将 md %author% 与上面的内容结合起来,它起作用了!非常感谢你们!!!!!!
    • 我如何处理空格,第一个我只使用了 straub,因为它是一个独特的名称,但是 Stephen King 无法正常工作,我在提示符中尝试了“Stephen King”并得到了一个以斯蒂芬金为标题的文件我也尝试了“斯蒂芬金”并得到了相同的结果
    • 试试...如果不是,请详细说明这个问题。 ;)
    【解决方案2】:

    试试这个:

    $author = (read-host -prompt 'Enter Name')
    
    $basedir = 'C:\Users\Amanda\Downloads'
    $destdir = "$basedir\BOOKS\$author"
    New-Item $destdir -Type directory
    
    Get-ChildItem $basedir -Recurse | ? {
      -not $_.PSIsContainer -and
      $_.Name -like "*$author*" -and
      $_.Directory.FullName -ne $destdir
    } | % {
      Copy-Item $_.FullName "$destdir\"
      Remove-Item $_.FullName
    }
    

    【讨论】:

    • 错误:复制项:找不到路径“C:\Users\Amanda\Downloads\BOOKS\stephen king \”的一部分。在 line:12 char:3 + Copy-Item $_.FullName "$destdir\" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ + CategoryInfo : NotSpecified: (:) [Copy-Item], DirectoryNotFoundException + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.CopyItemCommand
    • $author 中有一个尾随空格。在将字符串分配给变量之前修剪字符串。
    • 我现在明白了。谢谢你。但现在它只是说权限被拒绝,但这是一个不相关的问题。我需要找出哪些文件被阻止了。
    • 如果目录中有名称而不只是其中的文件,有没有办法让它移动整个目录?
    • 去掉$_.PSIsContainer之前的-not
    【解决方案3】:
    @echo off &setlocal
    set /p "author=Enter the author's name: "
    cd /d "C:\Users\Amanda\Downloads"
    md "books\%author%"
    for /r %%a in (*"%author%"*) do move "%%~fa" "books\%author%"
    

    【讨论】:

    • 我使用了这个建议中的 md %author%。谢谢!
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2021-06-30
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多