1

Код:

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

перечисляет имена файлов, которые я хотел бы:

  1. Создайте папку с оставшимся именем файла (после DET1__) в качестве заголовка папки
  2. Переместить этот файл в эту конкретную папку

Я знаю, что это не должно быть так сложно, но я действительно не знаком с использованием Windows для сценариев оболочки, и у меня нет доступа к оболочке в стиле UNIX на работе.

3 ответа3

7

Это примерно в сто раз проще в PowerShell, но это должно работать. Более подробные объяснения того, что происходит, можно найти в setlocal /? set /? а for /? , Пакетный язык не является хорошим языком, поэтому мы должны делать такие вещи, как использование ENABLEDELAYEDEXPANSION и использование !FILE! вместо %FILE% чтобы пакетный файл не устанавливал переменные один раз и никогда не обновлял их. Один ключ, который нужно помнить, состоит в том, что имена файлов и foldernames не могут быть одинаковыми. Так что вы не можете иметь файл и папку foo в C:\ .

Я не проверял это на самом деле, поэтому, пожалуйста, сделайте это самостоятельно, прежде чем что-то делать.

@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 verion:

$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
}
1

Если вы хотите использовать 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 Management Framework Core.

-1

Или просто используйте http://skwire.dcmembers.com/wb/pages/software/files-2-folder.php, который создает одну папку с выбранными вами файлами (проводник) или папку на файл без расширения, и перемещает файлы внутрь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .