コマンドライン(CMD)で特定の文字数のファイル名をコピーする

コマンドライン(CMD)で特定の文字数のファイル名をコピーする

名前が 5 文字であるすべてのテキスト ファイルを 1 つのフォルダーにコピーする必要があります。このコマンドはリスト用であることはわかっています。

$ dir folder /B | findstr /R "^.....\.txt"

しかし、上記のコマンドで名前がリストされているすべてのファイルを別のフォルダーにコピーしたいと思います。

答え1

私は(自分だけではなく)尋ねていました「それは簡単に機能しないのですか...」?

copy  C:\ORIG_DIR\?????.txt C:\Dest_Dir

G-Manのおかげで、パワーシェルそれは動作します一方、コマンドプロンプト上記のコマンドは、 で始まるすべての拡張子とともに、最大 5 文字までの一致をコピーします.txt

疑問符 (?)

名前内の 1 文字の代わりに疑問符を使用します。たとえば、gloss?.doc と入力すると、Glossy.doc または Gloss1.doc というファイルは見つかりますが、Glossary.doc は見つかりません。

参照:

答え2

これはバッチでも可能ですが、PowerShell では簡単です。

ls | foreach { if (($_.BaseName.Length -eq 5) -and ($_.Extension -eq ".txt")) 
    { $_.CopyTo("\Name\Of\Target\Folder\" + $_.Name) }

ファイル名を正規表現でチェックすることによっても実行できますが、この方法は問題なく機能します。

答え3

バッチでは次のようなことができます:

@Echo OFF

Set "targetDir=C:\Dir"

For %%# In ("*.txt") DO (

    (Echo "%%~nx#" | findstr /R "^......\.")1>Nul 2>&1 && (

        Echo Copying "%%~nx#" ...
        (Copy /Y "%%~f#" "%targetDir%\%%~nx#")1>NUL

    )
)

Pause&Exit /B 0

答え4

別のバッチアプローチを次に示します。

@エコーオフ
setlocal 有効遅延拡張
(*.txt) 内の %%f に対して (
      foo=%%f を設定する
      foo=!foo:~5,5! を設定します。
      !foo!==.txt の場合 (
            (このファイル名(%%f)はパターンに一致する?????。TXT; 好きなようにしてください。

は部分文字列メカニズム!foo:~5,5!のインスタンスです 。ファイル名の 6 番目の文字 (オフセット 5) から始まり、長さが 5 (キャプチャするのに十分な長さ+ 1 文字、さらにある場合) の部分文字列を抽出します。したがって、 ファイル名の 6 番目、7 番目、8 番目、9 番目の文字が、、、 であり、10 番目の文字がない場合、変数の値は になります。!variable:~offset:length!.txtfoo.txt.txt

関連情報