FORループ内のWindowsコマンドプロンプトで現在のディレクトリ名を取得するにはどうすればよいですか?

2
Mykola Novik 2020-05-07 07:31.

Win-1064ビットを使用しています。

私のWindowsマシンで次のディレクトリ構造を考えると...

c:\tmp\Logs_UAT\
'-> folder1
|   '-> test.txt
'-> folder2
    '-> test.txt

...各ディレクトリ内のすべてのファイルの名前を、ディレクトリ名の前に付けて名前を変更しようとしています。

c:\tmp\Logs_UAT\
'-> folder1
|   '-> folder1_test.txt
'-> folder2
    '-> folder2_test.txt

これを実現するために、%basedir%FORを使用してファイルを再帰的にループし、各ディレクトリで、内部のFOR「ループ」を使用して現在のディレクトリ名を取得し、名前を変更します。ただし、現在のディレクトリは通常正しく派生していません。問題を再現できる.batファイルは次のとおりです。

@echo off

set basedir=c:\tmp\Logs_UAT

for /R %basedir% %%I in (*) DO (
cd %%~pI

for %%G in (.) do echo %%~nxG> temp.temp
set /P curdir=<temp.temp
del /f temp.temp

echo.
echo -------------------
echo %%I
dir
echo %curdir%
echo -------------------
)

%curdir%両方のファイルに同じ値を出力します。

C:\tmp>test.bat

-------------------
c:\tmp\Logs_UAT\folder1\test.txt
 Datenträger in Laufwerk C: ist OSDisk
 Volumeseriennummer: D280-2DC0

 Verzeichnis von C:\tmp\Logs_UAT\folder1

06.05.2020  19:29    <DIR>          .
06.05.2020  19:29    <DIR>          ..
06.05.2020  19:02                 0 test.txt
               1 Datei(en),              0 Bytes
               2 Verzeichnis(se), 291.684.151.296 Bytes frei
folder2
-------------------
.
-------------------
c:\tmp\Logs_UAT\folder2\test.txt
 Datenträger in Laufwerk C: ist OSDisk
 Volumeseriennummer: D280-2DC0

 Verzeichnis von C:\tmp\Logs_UAT\folder2

06.05.2020  19:29    <DIR>          .
06.05.2020  19:29    <DIR>          ..
06.05.2020  19:02                 0 test.txt
               1 Datei(en),              0 Bytes
               2 Verzeichnis(se), 291.684.151.296 Bytes frei
folder2
-------------------

C:\tmp\Logs_UAT\folder2>

私は試した:

  1. 新鮮なコンソールウィンドウ
  2. コンソールとバッチファイル
  3. 最初のフォルダ名を取得することもあれば、2番目のフォルダ名を取得することもあります
  4. インターネットでたくさんの検索

追加のソフトウェアを持っていない可能性のある他のユーザーにスクリプトを配布する必要があるため、標準のWindowsユーティリティを使用することをお勧めします。

FORループ内のWindowsコマンドプロンプトで現在のディレクトリ名を取得するにはどうすればよいですか?

2 answers

2
Mykola Novik 2020-05-07 08:03.

確かにDelayedExpansionが役に立ちました、DavidPostillに感謝します。作業スクリプトは次のとおりです。

@echo off
SETLOCAL EnableDelayedExpansion
set basedir=c:\tmp\Logs_UAT

for /R %basedir% %%I in (*) DO (
cd %%~pI

for %%G in (.) do echo %%~nxG> temp.temp
set /P curdir=<temp.temp
del /f temp.temp

echo !curdir!
)

endlocal
2
It Wasn't Me 2020-05-07 08:37.
  • 1つのループで、質問と同じ結果を得るには、次のようにします。
@echo off

set "_=echo\ -------------------"
for /D /R "c:\tmp\Logs_UAT" %%I in (*
)do %_% & echo\%%~nxI & dir "%%~nxI" & echo\ %%~nxI & %_%
  • あなたの出力:
 -------------------

 Volume in drive C has no label.
 Volume Serial Number is 32E8-70C5

 Directory of c:\tmp\Logs_UAT\folder1

05/06/2020  02:40 PM    <DIR>          .
05/06/2020  02:40 PM    <DIR>          ..
05/06/2020  02:41 PM                 8 test.txt
               1 File(s)              8 bytes
               2 Dir(s)   3,128,999,936 bytes free
 folder1
 -------------------
 -------------------

 Volume in drive C has no label.
 Volume Serial Number is 32E8-70C5

 Directory of c:\tmp\Logs_UAT\folder2

05/06/2020  02:47 PM    <DIR>          .
05/06/2020  02:47 PM    <DIR>          ..
05/06/2020  02:48 PM                 7 folder2.txt
               1 File(s)              7 bytes
               2 Dir(s)   3,128,999,936 bytes free
 folder2
 -------------------


  1. すべてのサブディレクトリで再帰的に1つのforループで、を使用して複数のループを使用for /D /RするDelayedExpansion必要はありません。これにより、必要はなくなります。

    • FOR /R - Loop through files (recursively)
      FOR /D - Loop through several folders/directories
    • The option /D /r is undocumented, but can be a useful combination, while it will recurse through all subfolders the wildcard will only match against Folder/Directory names (not filenames) Note: Source linked to ss64.com

    • Rem :: Set your folder /Directory /Recursively tree starting at "c:\tmp\Logs_UAT"
      For /D /R "c:\tmp\Logs_UAT"
  2. 追加のループtemp.tempを使用for /Dして、ディレクトリ全体でファイルを作成および削除する必要があるのはなぜforですか?ループ内の現在のフォルダーの名前(/Rすべてのサブ/Dディレクトリで再帰的)が変数に格納されている場合%%~nxI(および他の多くのフォルダーも拡張的に使用可能)、ループで使用するには、それらを使用します...

    • Use the FOR variable syntax replacement:
      %~pI        - expands %I to a path only
      %~nI        - expands %I to a file name only
      %~xI        - expands %I to a file extension only
    • The modifiers can be combined to get compound results:
      %~pnI       - expands %I to a path and file name only
      %~pnxI      - expands %I to a path, file name and extension only
    • )do %_% & echo\%%~nxI & dir "%%~nxI" & echo\ %%~nxI & %_%

      OBS:使用について%%~xdirectoryで名前観測ノートss64.com

    • Full Stop Bug
      Although Win32 will not recognise any file or directory name that begins or ends 
      with a '.' (period/full stop) it is possible to include a Full Stop in the middle
      of a directory name and this can cause issues with FOR /D.
    • Parameter expansion will treat a Full Stop as a file extension, so for a directory
      name like "Sample 2.6.4" the output of %%~nI will be truncated to "Sample 2.6" to
      return the whole folder name use %%I or %%~nxI
  3. 使用する必要はありません、使用するDelayedExpansionことができますcmd /v/c echo\!curdir!またはecho\%%~nxI

    • By default expansion will happen just once, before each line is executed. The !delayed! expansion is performed each time the line is executed, or for each loop in a FOR looping command. Note: Source linked to ss64.com 

      それはまさにあなたのコードがあなたの質問(そして答え)でしていることです、あなたは複数のforループを使用しています、DelayedExpansionあなたが使用するfor /D /Rときに単一を使用した場合は必要ありません %%~nxI

      同じ結果を選択した行で使用する場合、1つ以上のforループDelayedExpansionを使用cmd /v /c echo\!curdir!している場合は、実行時に変数値を展開して有効にすることもできます。

    • )do set "curdir=%%~nxI" && cmd /v /c " echo\!curdir!"
  4. コード出力の質問と同じように出力を取得するには、バナーの変数を設定/使用し(set _=echo\ ----)、これを目的のレイアウト出力に調整します。

    • )do %_% & echo\%%~nxI & dir "%%~nxI" & echo\ %%~nxI & %_%

    または、1つの従来のフォーマットで

    • @echo off
      
      set "_=echo\ -------------------"
      
      for /D /R "c:\tmp\Logs_UAT" %%I in (*)do (
      
      %_%
      echo\%%~nxI
      dir "%%~nxI"
      echo\ %%~nxI
      %_%
      
      )
  5. for /D /Rループのある1行の1つの単純で短い出力オプションについては、次のことを試すことができます。

    • @echo off
      
      for /d /r "c:\tmp\Logs_UAT" %%I in (*)do set "curdir=%%~nxI" && cmd /v /c " echo\!curdir!"

  • さらに読む:

    [√]セット

    [√] CMD /?

    [√] Forループ

    [√] / Dループの場合

    [√] / Rループの場合

    [√] DelayedExpansion

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ソロ:スターウォーズストーリーのライターも確認:ハンが最初に撃った

ソロ:スターウォーズストーリーのライターも確認:ハンが最初に撃った

ハンソロは、サイエンスフィクションや宇宙映画で最も有名なキャラクターの1人です。しかし、約20年前、スターウォーズの最初の映画であるニューホープでバウンティハンターとの出会いを撮影したかどうかについて論争が始まりました。現在、ソロの作家:スターウォーズストーリーはそれについて何か言いたいことがあります。

フランケンシュタインから200年後、疲れた伝記はメアリーシェリーに命を吹き込もうとします

フランケンシュタインから200年後、疲れた伝記はメアリーシェリーに命を吹き込もうとします

フランケンシュタイン、または現代のプロメテウスは、若いメアリーシェリー(旧姓ゴッドウィン)が1818年に匿名で最初に出版した、不機嫌そうな10代のフィクションの例外的な作品であり、創造の新しい神話が間違っていたという新しい神話を世界にもたらしました。執着、そして彼が生き返らせて拒絶する無名の怪物。フランケンシュタインの映画化は、本自体とほぼ同じくらい長く(最も初期のものは1823年に成功した舞台劇でした)、ドラキュラの劇場版や映画版よりもさらに大きな影響を与えており、シャーロックホームズの物語はその出典を持っています素材。

今、あなたはカナダの最高のレーシングシリーズ、日産マイクラカップを見ることができます

今、あなたはカナダの最高のレーシングシリーズ、日産マイクラカップを見ることができます

以前にも言われましたが、空力補助装置がほとんどまたはまったくない小型の動力不足の車を含むモータースポーツを増やす必要があることを、頻繁に大声で繰り返す必要があります。カナダの日産マイクラカップシリーズは、Tに法案を適合させます。

アマゾンはマーベラスミセスメイゼルをもっと欲しがっている

アマゾンはマーベラスミセスメイゼルをもっと欲しがっている

昨夜の番組でピーボディ賞を受賞しているときにアマゾンの幹部に演説したシリーズクリエーターのエイミーシャーマンパラディーノからの穏やかな提案の後、次のように述べています。バラエティが報じているように、Amazon Studiosは、マーベラスミセスメイゼルが第3シーズンにリニューアルされたことを確認しました。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で 1 日を過ごし、ジェニファー・ロペス、ジュリアン・ハフなども。ハリウッドからニューヨークまで、そしてその間のあらゆる場所で、お気に入りのスターの活躍をご覧ください!

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

捜査官は、グループと容疑者が攻撃の前にお互いを知っていたかどうかを調べています

滑走路着陸

滑走路着陸

晩夏と秋はノスタルジックな季節。街灯は雨で濡れた通りに光を放ち、足元の葉 - 夕暮れの影の中で落ち着いた赤オレンジ - は過ぎ去った日々を思い出させます。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

2021 年には、サービスを提供する顧客と顧客に伝えるストーリーについて知っていることをすべて再考することをお勧めします。あとずさりする。

マンモスロスは私の心を愛に開いた

マンモスロスは私の心を愛に開いた

フェリックス ザ キャットの 9 歳の誕生日の日に、大人になってからの最大の損失の 1 つである 2013 年のソフィーを思い出します。私はこのエッセイを書き、2013 年にこのプラットフォームで簡単に共有しました。

あなたがインターネットがあなたに望んでいる人になれないとき

あなたがインターネットがあなたに望んでいる人になれないとき

私は「列車事故」という言葉が嫌いです。人々は自分自身の道徳的羅針盤に安らぎを覚え、そうすることで自分自身が判断を下していることに気づきます。

Language