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
}