Saya mencoba menulis skrip yang akan menemukan semua persimpangan direktori pada disk dan kemudian membuatnya kembali di lokasi lain. Pertama-tama, saya harus menemukan semua persimpangan dan mengedit output agar lebih mudah dibaca.
Ini adalah test.txt:
Volume in drive C has no label.
Volume Serial Number is A0D2-DFB0
Directory of C:\
14.07.2009. 06:08 <JUNCTION> Documents and Settings [C:\Users]
13.01.2015. 10:26 <JUNCTION> Users [E:\Users]
0 File(s) 0 bytes
Directory of C:\ProgramData
14.07.2009. 06:08 <JUNCTION> Application Data [C:\ProgramData]
14.07.2009. 06:08 <JUNCTION> Desktop [C:\Users\Public\Desktop]
14.07.2009. 06:08 <JUNCTION> Documents [C:\Users\Public\Documents]
14.07.2009. 06:08 <JUNCTION> Favorites [C:\Users\Public\Favorites]
14.07.2009. 06:08 <JUNCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
14.07.2009. 06:08 <JUNCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]
0 File(s) 0 bytes
Directory of C:\ProgramData\Oracle\Java\javapath
24.12.2014. 18:22 <SYMLINK> java.exe [D:\Programs\Java 8u25\bin\java.exe]
24.12.2014. 18:22 <SYMLINK> javaw.exe [D:\Programs\Java 8u25\bin\javaw.exe]
24.12.2014. 18:22 <SYMLINK> javaws.exe [D:\Programs\Java 8u25\bin\javaws.exe]
3 File(s) 0 bytes
Total Files Listed:
3 File(s) 0 bytes
8 Dir(s) 16.309.276.672 bytes free
- Ini adalah skrip (belum selesai) yang saya jalankan:
echo on
cd \
set start=
set end=
set paths=
type NUL > output.txt
for /f "tokens=* skip=3" %%l in (C:\test.txt) do (
for /f "tokens=1" %%d in ("%%l") do (
if %%d==Directory (
for /f "tokens=3" %%p in ("%%l") do (
set start="%%p"
)
) else (
for /f "tokens=3" %%j in ("%%l") do (
if %%j==^<JUNCTION^> (
for /f "tokens=4*" %%h in ("%%l") do (
set end="%%h"
echo %start% %end% >> output.txt
)
)
)
)
)
)
Masalahnya adalah bahwa output.txt berakhir dengan beberapa baris "Echo ON" alih-alih memiliki jalur di sana. Jika saya mengganti "% mulai%% akhir%" dengan string apa pun (mis. "Sosis") saya mendapatkan output.txt diisi dengan sosis. Jika saya menjalankan echo set% end% setelah skrip berjalan, output adalah "Templates" yang diharapkan. Saya menduga perintah set tidak mengatur apa pun sampai salah satu loop selesai.
Apakah saya benar? Apakah ada jalan keluarnya? Saya benar-benar perlu menjalankan ini di CMD karena harus dijalankan dari disk Windows Repair.
P.S. Saya tahu kode saya tidak akan berfungsi untuk tujuan saya walaupun dengan program ini diperbaiki, tetapi saya baru saja sampai di sana, hal pertama yang pertama.
sumber
Jawaban:
Jika Anda menggunakan skrip asli Anda dan tambahkan
setlocal enabledelayedexpansion
Anda bisa mengganti%start%
dan%end%
oleh!start!
dan!end!
dan skrip Anda akan berfungsi seperti yang Anda inginkan.Skrip Anda tidak mengizinkan kosong pada nama file, jadi saya usulkan skrip dimodifikasi berikut:
Saya telah melakukan dua hal tambahan di sini: -
^
tidak dapat diindentasi, yang merusak pemformatan yang keduaif
).for
loop sementara pada saat yang sama memungkinkan untuk tertanam kosong di direktori dan nama file.Saya telah meninggalkan mereka, tetapi inisial
cd \
danset
inisialisasi tidak diperlukan, meskipun Anda mungkin ingin menghapusstart
danend
sebelum keluar.sumber
Menggantikan
echo %start% %end% >> output.txt
dengancall :forecho
dan lampirkan cuplikan kode berikutnya di bawah baris skrip terakhir:Masalahnya terletak pada fakta bahwa% variabel% diperluas, perintah demi perintah, pada waktu parse daripada pada waktu eksekusi. Dan semua cuplikan kode terlampir
(
tanda kurung)
dianggap sebagai satu-satunya perintah.Agar aman, mulai skrip Anda dengan
Seluruh skrip dapat sebagai berikut:
sumber