Windows 批处理脚本为目录中的每个文件创建文件夹,命名,然后将文件移动到该文件夹​​中

Windows 批处理脚本为目录中的每个文件创建文件夹,命名,然后将文件移动到该文件夹​​中

代码:

for %%X in ("C:\Info\AUGUST 2011\Checklists\DET1__*") do (echo %%X)

列出我想要的文件的名称:

  1. 创建一个文件夹,将文件名的其余部分( 之后DET1__)作为文件夹的标题
  2. 将该文件移动到特定文件夹中

我知道这应该不太难,但我真的不熟悉使用 Windows 进行 shell 脚本编写,并且在工作中无法使用 UNIX 风格的 shell。

答案1

在 PowerShell 中,这大约容易一百倍,但这应该可行。有关发生的事情的更好解释可以在setlocal /?set /?和中找到for /?。批处理不是一种好的语言,因此我们必须使用ENABLEDELAYEDEXPANSION和 使用!FILE!而不是 来防止批处理文件设置一次变量后再也不更新它。要记住的一个关键是文件名和文件夹名不能相同。因此,例如,%FILE%您不能同时拥有文件和文件夹fooC:\

我有不是确实测试过这些,所以在做任何事情之前请先自己测试一下。

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%X IN ("C:\Info\AUGUST 2011\Checklists\DET1__*") DO (
    SET FILEPATH=%~fX
    SET FILENAME=%~nxX
    SET TEMPFILE=%~fX.tmp
    MOVE "!FILEPATH!" "!TEMPFILE!"
    MKDIR "!FILEPATH!"
    MOVE "!TEMPFILE!" "!FILEPATH!\!FILENAME!"
)
ENDLOCAL

PowerShell 版本:

$Files = Get-ChildItem -Path 'C:\Info\AUGUST 2011\Checklists\' -Filter 'DET1__*'
$Files | ForEach-Object {
    $FileFullName = $_.FullName
    $TempFileName = "$($FileFullName).tmp"
    $DestinationFileName = "$FileFullName\$($_.Name)"
    Move-Item $FileFullName $TempFileName
    New-Item -Path $FileFullName -ItemType Directory
    Move-Item $TempFileName $DestinationFileName
}

答案2

如果您愿意使用 powershell 而不是批处理脚本,您可以执行以下操作:

$files = get-childitem "C:\Info\AUGUST 2011\Checklists\DET1__*"
ForEach ($file in $files) {
    $dirname = $file.fullname.replace("DET1__","")
    New-Item -Path $dirname -type directory
    Move-Item $file $dirname
}

根据 Windows 的版本,你可能默认安装了 powershell (Win7/Vista)。如果你使用的是 XP,那么你必须下载它来自 Windows 管理框架核心链接。

答案3

或者直接使用http://skwire.dcmembers.com/wb/pages/software/files-2-folder.php它会创建一个包含您选择的(资源管理器)文件的文件夹,或者每个文件一个文件夹(不带扩展名),然后将文件移动到里面。

相关内容