Bagaimana cara mengekstrak bagian dari string dalam file batch Windows?

29

Misalkan saya memiliki nilai seperti "Abc_123" yang disimpan dalam variabel dalam file batch (cmd). Saya ingin berakhir dengan variabel yang hanya berisi "123". Apakah ada cara bawaan untuk melakukan ini?

Saya tidak terlalu pilih-pilih tentang metode, atau kinerja, asalkan itu dibangun untuk sistem Windows (Vista / 2008) yang khas.

Ken
sumber

Jawaban:

40

Gunakan sintaksis substrat:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123
John T
sumber
4
Anda dapat melihat sintaks lengkap dengan help setsebagaimana disebutkan dalam Apa cara terbaik untuk melakukan substring dalam file batch? di StackOverflow.
User5910
1
Jika saya membutuhkan 4 dan 3 sebagai input variabel, bagaimana saya melakukannya? %string:~%start%,%len%%
MakPo
sudahlah. Saya menemukan jawabannya. ss64.com/nt/syntax-substring.html
MakPo
3
Untuk meringkas tautan dari @MakPo: use CALL, likeCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

Jika Anda hanya ingin semuanya setelah garis bawah (dan tidak perlu tahu panjang string atau di mana garis bawah itu, tetapi dapat mengandalkan hanya ada satu garis bawah), coba:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

Pada dasarnya, string Anda akan dibagi menjadi token menggunakan garis bawah sebagai pembatas (delims = _). Hanya yang kedua (token = 2) yang akan diteruskan (sebagai variabel %% a) ke loop for. Loop hanya akan berjalan sekali karena Anda berurusan dengan string tunggal dalam kasus ini.

Jika Anda ingin menyimpan barang sebelum dan sesudah garis bawah, coba:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

Perhatikan bahwa %% a adalah variabel untuk token pertama dari pemisahan; %% b adalah variabel untuk token kedua dari pemisahan.

DocOc
sumber
3

Jika Anda menemukan bahwa bahasa kumpulan tidak cukup kuat untuk melakukan apa yang Anda inginkan - dan sepertinya tidak akan memakan waktu terlalu lama untuk sampai ke titik itu - Anda dapat menggunakan Windows PowerShell . Ini tidak diinstal secara default di semua versi Windows, tetapi Anda dapat mengunduhnya secara gratis.

Jika Anda tidak menyukai bahasa PowerShell, ada Perl. Anda harus menginstalnya di semua sistem. Ada juga yang lain.

Wayne Johnston
sumber
Pertanyaannya bukan bertanya tentang Powershell atau Perl
Zimba
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
sumber
3
Apa yang dilakukan ini secara khusus?
Pimp Juice,
Oh, jika Anda bertanya bagaimana kode ini bekerja: itu menghapus semua sebelum nomor, didahului dengan garis bawah.
Zimba
@Zimba apakah ada cara untuk hanya memperpanjang ini ke "last _"? Di mana saya dapat menemukan ini di dokumentasi?
TWiStErRob
Oke, temukan dokumen, ditambahkan untuk menjawab. Masih ada pertanyaan: bagaimana cara membuat saya *serakah? Saya menggunakan ol yang baik IF NOT ... GOTO :replace, tetapi akan menyenangkan jika ada cara yang lebih baik.
TWiStErRob
1
@TWiStErRob: Begitu. Jika Anda tidak tahu berapa jumlahnya _, maka beralih ke yang terakhir, kemudianset var
Zimba