Windowsのコマンドラインでパスなしでのみファイル名を取得する方法は?


31
for /r %f in (*) do echo %f

出力ファイル名とパス全体を提供します

\path\to\dir\<filename>

<filename>パスが含まれていないだけを取得するにはどうすればよいですか?その「ファイル名」文字列を使用する必要があります。

また、ファイル名を取得したら、次のことを実行できますか?

for /r %%f in (*) do (
echo "blah blah blah 'filename'" >> blahblah_filename.txt
)

3
将来の参考のために、MicrosoftにはオンラインのWindows XP-コマンドラインリファレンスAZがあり、それはそれ以降のバージョンにもほとんど適用できます。受け入れた回答のドキュメントは、forコマンドのセクションの最後にあります。
マルティノー

@martineau:残念ながら、オンラインの「Windows XP-コマンドラインリファレンスAZ」ページはオンラインではなくなり(Microsoftによって削除されました)、このドキュメントの代替はまだ利用できません(「 %〜 '引数のドキュメント)
-PapaAtHome

@PapaAtHome:幸いにも、web.archive.orgのwayback machineを介してコマンドラインリファレンスを表示できます。
マルティノー

回答:


54

に使用%~nxf<filename>.<extension>ます。

はい、できます:

for /r %%f in (*) do (
echo "blah blah blah '%%~nxf'" >> blahblah_%%~nxf.txt
)

参照for /?

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.

素晴らしい答え。フルパスで部分文字列を検索する方法はありますか?たとえば、c:\ code \ myapp \ .git \ somefolderにテキスト「.git」が含まれているかどうかを知りたいです。
デールバーナード

1
パスをfindor findstrコマンドにパイプすることで、テキスト検索または正規表現検索を実行できます。たとえば、echo %%f | find "\.git\" > NULor echo %%f | findstr /R /C:"\\\.git\\" /C:"\\\.git\>" > NULを実行し、ifコマンドでエラーレベルをチェックします。(findstr正規表現は非常に限られているため、先頭\と[末尾\または文字列の末尾] を強制する試みです)。if errorlevelフォールスルーの癖があることに注意してください。おそらくif %errorlevel%ループ内に入れることはできないので、SetLocal EnableDelayedExpansion最初に、次にif !errorlevel!代わりに行う必要があるかもしれません。
ボブ

@DaleBarnardまた、PowerShellの使用を検討してください- 痛みがはるかに少なく、おそらくより一貫した結果が得られます。
ボブ

何とか何とかして私を混乱させていますが、それは何を表しているのでしょうか?ファイルの完全なパスと抽出されたファイル名は、この回答にどのように適合しますか?
thebunnyrules

%~nxf最初の文で述べたように、@ thebunnyrules はファイル名です。あなたは、バッチファイル内で使用するときは、ダブルアップする必要があり%、それを作ります、%%~nxfblah blah blahちょうど疑問に例を取って、交換されたfilenameとのビットを%%~nxf置換- blahsがちょうどフィラーであり、特段の意味を持ちません。
ボブ

0

私はまだコメントできませんが、混乱を避けるために次のことに注意する必要があると思います。

一方でf、変数名FORとして使用することができ、それは形式の文字で、それを混乱を避けるために別の文字を使用するのが最善ですf(ボブの答えで述べたように、完全なパス名を返します)、または少なくとも使用時の首都F

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.