web-dev-qa-db-ja.com

dirコマンドを使用して拡張子なしのファイル名のみを表示する方法

拡張子を除いたファイル名をリストアップしようとしていますが、

どうやって欲しい:

File1
File2
File3

現在の状況:

File1.txt
File2.txt
File3.txt

使ってみた

@echo off
dir /A:-D /B
pause

しかし、それは機能していません。バッチファイルとコマンドプロンプトの両方で試してみました。

正しいコマンドを使用していますか?

4
Jeremy Bierley

FORとECHOを使用してこれを達成する

たとえば、拡張子が常に.txtであると仮定します。

for %f  in ("*.txt") do @echo %~nf

DIRを使用する代わりに、FORコマンドを使用してリストを調べ、それぞれをECHOに送信し、「〜n」オプションを%fに挿入して、拡張子を表示しません。

代替案は

FORFILES /c "cmd /c echo @fname"

ただし、これを使用すると、各出力ファイル名を引用符で囲みます。

バッチファイル内で実行する場合は、変数の%を2倍にする必要があります。

for %%f in ("*.txt") do @echo %%~nf

複数のファイル拡張子を処理する必要がある場合

ディレクトリに名前に拡張子があるサブディレクトリが含まれていない限り、*.txt*.*に一般化できます。

for %f in ("*.*") do @echo %~nf

拡張子のないファイルがある場合

ファイルに拡張子が付いているが、その前に何もない場合。 .gitignore、結果の空のECHOコマンドは、ECHO is on.などの異常なメッセージを出力します。これを回避するには、ECHO isを含む行をFINDコマンドと/Vオプション:

for %f in ("*.*") do @echo %~nf | find /v "ECHO is"

もちろん、ローカル言語によってDOSがECHO is以外のものを出力する場合、このフィルタリングは機能しません。そして、ファイル名にECHO isが含まれているファイルを見逃します。

結論

これはおかしなことですが、これは、他の言語ではなく(すべてで)バッチ言語を使用するために支払う苦痛の代償です。私はアルコール依存症のようで、Batchコードの行を二度と書くことは決してないことを約束していて、それから自分が再びそうするために戻ってくるのを大胆に思います。

4
Eureka

これは、dirコマンドとforループで可能です。

@echo off

for /F "delims= eol=" %%A IN ('dir /A-D /B') do echo %%~nA

拡張子なしでフルパスが必要な場合は、以下を試してください。

@echo off

for /F "delims= eol=" %%A IN ('dir /A-D /B') do echo %%~dpnA

Cmd 1行の場合:

for /F "delims= eol=" %A IN ('dir /A-D /B') do echo %~nA

そして、拡張子なしのフルパスの場合は、以下を試してください。

for /F "delims= eol=" %A IN ('dir /A-D /B') do echo %~dpnA

これらの小さなプログラムは、ディレクトリを除くフォルダー内のすべてのファイルをループ処理し、echo拡張子なしのファイル名/完全パスのみをループします。

1
double-beep

ユーレカの答えに追加すると、Vanilla dirコマンドは、あなたが探しているものを達成できません。

_C:\Users\jacob>dir /?
Displays a list of files and subdirectories in a directory.

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              Specifies drive, directory, and/or files to list.

  /A          Displays files with specified attributes.
  attributes   D  Directories                R  Read-only files
               H  Hidden files               A  Files ready for archiving
               S  System files               I  Not content indexed files
               L  Reparse Points             -  Prefix meaning not
  /B          Uses bare format (no heading information or summary).
  /C          Display the thousand separator in file sizes.  This is the
              default.  Use /-C to disable display of separator.
  /D          Same as wide but files are list sorted by column.
  /L          Uses lowercase.
  /N          New long list format where filenames are on the far right.
  /O          List by files in sorted order.
  sortorder    N  By name (alphabetic)       S  By size (smallest first)
               E  By extension (alphabetic)  D  By date/time (oldest first)
               G  Group directories first    -  Prefix to reverse order
  /P          Pauses after each screenful of information.
  /Q          Display the owner of the file.
  /R          Display alternate data streams of the file.
  /S          Displays files in specified directory and all subdirectories.
  /T          Controls which time field displayed or used for sorting
  timefield   C  Creation
              A  Last Access
              W  Last Written
  /W          Uses wide list format.
  /X          This displays the short names generated for non-8dot3 file
              names.  The format is that of /N with the short name inserted
              before the long name. If no short name is present, blanks are
              displayed in its place.
  /4          Displays four-digit years

Switches may be preset in the DIRCMD environment variable.  Override
preset switches by prefixing any switch with - (hyphen)--for example, /-W.
_

さらに、_("*.txt")_の使用を提案する代わりに、ファイルリストに複数の拡張子が含まれている場合は、異なる拡張子を除外することもできますまたは _*.*_を使用して、_._の名前。そのグロブで遊んで、必要なものを取り出してください。

0
Jacob

PowerShellの方がはるかに簡単になります

(Get-ChildItem -File).BaseName

または

Get-ChildItem | ForEach-Object { $_.BaseName }

Get-ChildItem エイリアスlsgciまたはdirおよび ForEach-Object で置き換えることができます= %で置き換えることができます

したがって、cmdからこれらのいずれかを実行して目的を達成できます

powershell -Com "(ls -File).BaseName"
powershell -Com (ls^ -File).BaseName
0
phuclv