質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

1回答

201閲覧

バッチ処理での文字列切り取り方法について

taka0920

総合スコア3

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2024/07/18 01:14

編集2024/07/18 01:17

お世話になっております。
バッチ処理での文字列の切り取り処理について教えてください。

実現したいこと

ループ内で文字列の切り取り処理をしたいと考えています。
以下を実行しても切り取った文字は出力されず、(空)で出力されてしまうため、
切り取った文字列を取得する方法を知りたいです。

該当のソースコード

CMD

1setlocal enabledelayedexpansion 2 3rem フォルダ内のファイル分だけループ 4for %%a in (*.txt) do ( 5 6 rem ファイル名を取得 7 set FILE_NAME=%%a 8 9 rem ファイル名の先頭から3文字を切り取り 10 set FILE_NAME_TEMP=%!FILE_NAME!:~0,3% 11 12 rem ここで切り取った文字列を出力したいが、(空)で出力される 13 echo !FILE_NAME_TEMP! 14 15) 16

代替案として、正規表現で不要な文字を置換するなど考えてみましたが、バッチ処理での文字列置換が調べてもよくわからず、上記の切り取りの方法でできたらと思っています。

実現方法わかる方いらっしゃいましたらお手数をおかけしますがご教示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

何故、

cmd

1set FILE_NAME_TEMP=%!FILE_NAME!:~0,3%

と書いてしまったのか?
前回の回答の「%による環境変数展開は構文解析の直前に行われます」という意味が理解できてないと言うことでしょうが、その理解がないとしても、%!FILE_NAME!:~0,3%と書いてしまったというのは、
部分文字列取り出しの%変数名:~開始位置,長さ%あるいは!変数名:~開始位置,長さ!という基本文法も理解できてないということかと思います。

正しくは、下記です。

cmd

1set FILE_NAME_TEMP=!FILE_NAME:~0,3!

投稿2024/07/18 01:49

otn

総合スコア85458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka0920

2024/07/18 06:37

回答いただきありがとうございました。 今までバッチ処理をちゃんと作ったことがないため、基本的なことも分かっておらずお手間とらせてしまい申し訳ありませんでした。 %!FILE_NAME!:~0,3%と書いてしまったのは、文字列切り取りの構文を記述する際は「%%」も必須だと思ったためです。切り取り構文中の%%と環境変数に付与する%%は別物だという認識でした。 これに関して勉強のために教えていただきたいのですが、切り取り開始位置に変数を用いたい場合、 call set FILE_NAME_TEMP=!FILE_NAME:~start,end!とすればよいのでしょうか。
otn

2024/07/18 09:23

> 今までバッチ処理をちゃんと作ったことがないため、基本的なことも分かっておらず 前提知識不足で、日本語読解が不安なら、1-2行の「読解が間違ってないことを確認する目的だけのスクリプト」を書いて実行してみれば良いだけです。私もそれはよくやります。初心者はそういうことをやらないようですね。 「自分のやったことに間違いは無い」「自分の文章読解に間違いが無い」という呪縛から逃れられれば、初心者卒業も近いと思います。 > 切り取り開始位置に変数を用いたい場合、 カンマの後の数字は、「終わり位置」じゃありませんよ。「長さ」です。 set start=0 set len=3 して、startとlenを使って取り出し範囲を指定したいと言うことですね。 set start=0 set len=3 が構文解析以前、つまり、質問文のコードだと4行目のforよりも前なら、%start% %len%で値を取り出せるので、 set FILE_NAME_TEMP=!FILE_NAME:~%start%,%len%! でOKです。callは不要。 構文解析時に、 set FILE_NAME_TEMP=!FILE_NAME:~0,3! になります。 もし forの( ) 内に書いていても、常に値が0と3ならforの前に移動すれば良いです。 forの ( ) の中で、set /a start+=1 (startの値に1を足す) とかあって値が変動するなら、 前回の回答に書いた案2を採用して、括弧を使うのを止めればいいです。 括弧を使っても可能ではありますが、公式には明記されてない機能を使うため、 自力で見つけられなければ止めた方が良いです。 ということで、今後は案2を強くお勧めします。 参考:前回の回答 https://teratail.com/questions/tmxg5s48xbhr6h
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問