skrip batch Windows untuk membuat folder untuk setiap file dalam direktori, beri nama, daripada memindahkan file ke folder itu

1

Kode:

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

daftar nama file yang ingin saya:

  1. Buat folder dengan sisa nama file (setelah DET1__ ) sebagai judul folder
  2. Pindahkan file itu ke folder spesifik itu

Saya tahu ini seharusnya tidak terlalu sulit, tetapi saya benar-benar tidak terbiasa menggunakan Windows untuk skrip shell, dan saya tidak memiliki akses ke shell gaya UNIX di tempat kerja.

Hortinstein
sumber

Jawaban:

7

Ini sekitar seratus kali lebih mudah di PowerShell, tetapi ini seharusnya berhasil. Penjelasan yang lebih baik tentang apa yang terjadi dapat ditemukan di setlocal /?, set /? dan for /?. Batch bukan bahasa yang baik, jadi kami harus melakukan hal-hal seperti menggunakan ENABLEDELAYEDEXPANSION dan penggunaannya !FILE! dari pada %FILE% untuk mencegah file batch mengatur variabel sekali dan tidak pernah memperbaruinya. Satu kunci untuk diingat adalah bahwa nama file dan nama folder tidak boleh sama. Jadi Anda tidak dapat memiliki file dan folder foo di C:\, sebagai contoh.

saya sudah tidak diuji ini benar-benar, jadi tolong lakukan sendiri sebelum melakukan sesuatu.

@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

Versi 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
}
Bacon Bits
sumber
Sepertinya Anda lupa mengekstrak bagian DET1__ dari nama file sebelum membuat direktori (akan bertanya mengapa pembuatan file temp sampai saya menyadari bahwa Anda akan mencari direktori yang secara identik dinamai dengan nama file). +1 untuk kode kumpulan yang tidak pernah saya buat :)
Matrix Mole
@matrix Ah, saya melewatkan bagian dari pertanyaan awal. Biarkan saya memperbaruinya. Harus menggunakan substitusi lingkungan juga, saya curiga.
Bacon Bits
Biarkan saya memperbaruinya di pagi hari jika saya ingat ... hanya melihat waktu. Harus menggunakan substitusi lingkungan (seperti SET FILENAME=!FILENAME:~7! ) juga, saya curiga (lihat set /? ). Solusi PowerShell Anda lebih baik, @ Matrix.
Bacon Bits
Saya mendapatkan kesalahan ini: The following usage of the path operator in batch-parameter substitution is invalid: %~fx. Sayangnya Powershell dinonaktifkan oleh kebijakan lokal dan grup, jadi macet dengan BAT
Hortinstein
Saya akan memeriksa kembali di pagi hari, terima kasih atas bantuannya!
Hortinstein
1

Jika Anda ingin menggunakan PowerShell alih-alih batch scripting, Anda dapat melakukan hal berikut:

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

Tergantung pada versi Windows yang mana, Anda mungkin telah menginstal PowerShell secara default (Win7 / Vista). Jika Anda memiliki XP, maka Anda harus melakukannya unduh itu dari tautan Inti Kerangka Manajemen Windows.

Matrix Mole
sumber