Windowsバッチファイルで文字列の一部を抽出する方法


29

バッチ(cmd)ファイルの変数に格納されている「Abc_123」などの値があるとします。「123」だけを含む変数になりたいのですが。これを行う組み込みの方法はありますか?

典型的なWindows(Vista / 2008)システムに組み込まれている限り、私はメソッドやパフォーマンスについてひどくうるさくはありません。

回答:


40

サブストリング構文を使用します。

C:\Users\John>set string=Abc_123

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

C:\Users\John>echo %string:~4,3%
123

4
あなたはとの完全な構文を見ることができるhelp setで述べたように、バッチファイル内の部分文字列を行うための最善の方法は何ですか?StackOverflowで。
User5910

1
4と3を変数入力にする必要がある場合、どうすればよいですか?%string:~%start%,%len%%
MakPo

気にしないで。答えを見つけました。ss64.com/nt/syntax-substring.html
MakPo

3
@MakPoからのリンクを要約するにはCALL、次のように使用しますCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny

8

アンダースコアの後のすべてが必要な場合(そして、文字列の長さやアンダースコアの場所が必ずしもわからないが、アンダースコアが1つしかないことに依存できる場合)は、以下を試してください。

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

基本的に、文字列はアンダースコアをデリミタとして使用してトークンに分割されます(delims = _)。2番目のトークン(tokens = 2)だけが(変数%% aとして)forループに渡されます。この場合、単一の文字列を処理しているため、ループは1回だけ実行されます。

アンダースコアの前後の両方を保存したい場合は、以下を試してください:

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

%% aはスプリットの最初のトークンの変数であることに注意してください。%% bは、スプリットの2番目のトークンの変数です。


3

バッチ言語が必要な機能を実行するのに十分強力ではなく、その時点までにそれほど時間がかからない場合は、Windows PowerShellを使用できます。これはWindowsのすべてのバージョンにデフォルトでインストールされるわけではありませんが、無料でダウンロードできます。

PowerShell言語が気に入らない場合は、Perlがあります。ただし、それをすべてのシステムにインストールする必要があります。他にもあります。


問題は、PowershellやPerlに関するものではありません
Zimba

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
これは具体的に何をしますか?
Pimp Juice IT

ああ、このコードがどのように機能するかを尋ねていた場合:アンダースコアを前に付けて、数値の前のすべてを削除します。
ジンバ

@Zimbaはこれを単に「最後の_」に拡張する方法はありますか?また、これはドキュメントのどこにありますか?
TWiStErRob

回答にドキュメントを追加しました。質問はまだ残っています:どうすれば*貪欲にできますか?私は良いol 'を使いましたIF NOT ... GOTO :replaceが、もっと良い方法があればいいのですが。
TWiStErRob

1
@TWiStErRob:なるほど。あなたはどのように多くのわからない場合は_、その後、最後の1に、そしてループがあるset var
Zimba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.