Windows コマンドプロンプトで「cut」を置き換えるにはどうすればいいですか?

Windows コマンドプロンプトで「cut」を置き換えるにはどうすればいいですか?

次のような名前パターンに一致するサブフォルダーのセットを含むディレクトリがあります。

sub-123
sub-0815
sub-4711

このフォルダの中には、フォルダ名と同じ番号のファイルがいくつかあります。例えば、サブ123フォルダにはファイルが含まれています。

input-123
output-123

フォルダを反復処理し、作業ディレクトリを現在のフォルダに変更し、適切なファイルセットで何らかの処理を行いたい。

for /d %%d in (sub-*) do .

上記の例の「123」のアスタリスクに一致するフォルダ名の部分が必要です。フォルダ名から123を抽出して、次のようなコマンドを作成するにはどうすればよいでしょうか。

cd sub-123
copy input-123 output-123

Windows 7 のバッチ ファイル内では? Linux 環境では、cut コマンドや正規表現を使用できる可能性があります。しかし、Windows コマンド プロンプトではどのように実行すればよいでしょうか?

答え1

自分で見つけました。set コマンドには拡張変数置換機能があります。ただし、本体自体では使用できませんfor。新しいバッチ呼び出しコンテキストを開始する必要があります。

for /d %%d in (sub-*) do (
  set item=%%d
  pushd %%d
  call :build
  popd
)
goto :eof

:build
  set item=%item:sub-=%
  copy input-%item% output-%item%
:eof

「item」はアスタリスクに一致した文字列から正確に構築されるわけではありませんが、同等です。

答え2

直接的な答えも見つかりました。それはカットセマンティクスに近いです。

setコマンドには部分文字列構文もあります。n文字をスキップするには、を使用します。%variable:~n%オフセットkからn文字を取得するには、を使用します。%variable:~k,n%

for /d %%d in (sub-*) do (
  set item=%%d
  set num=%item:~4%
  pushd %%d
  copy input-%num% output-%num%
  popd
)

関連情報