Membandingkan bagian dari nama file dalam file batch windows

1

Pertimbangkan skrip ini:

SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
 if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ ) 
ENDLOCAL

dipanggil sebagai thisscript 11111.9100.csv

Yang ingin saya lakukan adalah: pindahkan file ke folder yang benar, berdasarkan segmen kedua dari nama file (9100), jadi jika lebih besar dari 9200 pindahkan ke satu folder dan jika tidak, pindah ke folder lain.

Masalahnya tampaknya perbandingan itu tidak berfungsi.

user192750
sumber

Jawaban:

1

Dennis mengidentifikasi satu masalah dan memberikan solusi dalam jawabannya. Namun masih ada masalah lain.

1) Kode Anda set partial_name = %%G akan menyertakan spasi tambahan dalam nama variabel dan spasi terdepan dalam nilai. Kode harus dibaca set partial_name=%%G

2) milik Anda %1 nilai mungkin sudah dikutip, dalam hal ini Anda harus menghapus tanda kutip sebelum menambahkan Anda sendiri dengan menggunakan "%~1" dari pada "%1".

3) Mungkin bukan masalah dalam kasus Anda, tetapi umumnya merupakan ide yang baik untuk menyertakan path file dalam tanda kutip jika namanya mengandung spasi atau karakter khusus.

4) Saya berasumsi Anda ingin melakukan perbandingan angka. Perintah IF menggunakan aturan yang hampir sama dengan perintah SET / A ketika mencoba mengurai angka - Angka apa pun yang diawali dengan 0 akan diperlakukan sebagai notasi heksadesimal. Jika menemukan digit hex yang tidak valid seperti 8 atau 9, maka IF akan kembali ke perbandingan string, bukan perbandingan numerik.

Sebagai contoh if 09 lss 8 (echo true) else echo false kembali true.

Jadi, jika segmen ke-2 dari nama file Anda memiliki potensi untuk memimpin nol, maka Anda perlu melakukan lebih banyak pekerjaan.

set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
  for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
  if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
  move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
  move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)
dbenham
sumber
dbenham, Terima kasih atas solusi brilian ini! Itu bekerja segera. / Rolf
user192750
1

Anda benar-benar membandingkan string partial_name untuk 9100, bukan isi dari variabel.

Sejak p GEQ 9, ini akan dievaluasi ke true.

Juga, set partial_name = %%G set partial_name  untuk  %%G (perhatikan spasi tambahan dan spasi terkemuka).

Untuk memperbaiki kedua masalah ini, mengelilingi nama variabel dengan tanda persen ( % ) dan hapus spasi di sekitar tanda sama dengan ( = ):

for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
 if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )
Dennis
sumber
Anda telah mengidentifikasi dan memperbaiki satu masalah, tetapi ada lebih banyak :-) Lihat Jawabanku
dbenham
Kamu benar. Itu tidak akan bekerja dengan spasi.
Dennis