Windowsバッチスクリプトで絶対パスを取得するための変数


9

私は、.phtml拡張子を持つすべてのファイルをディレクトリから再帰的にリストする次のスクリプトを持っています。

@echo off
setlocal
for /f %%G in ('forfiles /s /m *.phtml /c "cmd /c echo @relpath"') do echo %%G >> listoffiles.txt
endlocal
exit

ファイルへの相対パスのみをリストします。上記のスクリプトは中間の場所から実行されているため、@relpath変数のフルパスを取得できません。

また、削除したい結果行に引用符が表示されています。

コードを少し変更して、これらのファイルへの絶対パスを取得したいのですが、自分のコードで使用できるグローバル変数が利用できる場合は、Windowsバッチスクリプターがあまり好きではないので、それが最適です。

回答:


3

@relpath変数の完全なパスが得られません。

また、削除したい結果行に引用符が表示されています。

次のバッチファイルは、必要な処理を実行します。

@echo off
setlocal enableDelayedExpansion
for /f %%G in ('forfiles /s /m *.phtml /c "cmd /c echo @path"') do (
  set _name=%%G
  rem strip the quotes
  echo !_name:~1,-1! >> listoffiles.txt
  )
endlocal
exit

ノート:

  • @path(ファイルの@relpath相対パス)の代わりに(ファイルの完全パス)を使用します。
  • 変数substring式を使用して引用符を削除します(:~1,-1変数文字列から最初と最後の文字を削除します)。
  • setlocal EnableDelayedExpansion変数がforループで正しく更新されるように使用します。

参考文献

  • Windows CMDコマンドラインのAZインデックス -Windows cmdラインに関連するすべてのものの優れたリファレンス。
  • enabledelayedexpansion-遅延展開では、変数は解析時ではなく実行時に展開されます。
  • for / f-別のコマンドの結果に対してコマンドをループします。
  • forfiles-ファイル(またはファイルのセット)を選択し、各ファイルに対してコマンドを実行します。バッチ処理。
  • variables-変数(部分文字列)の一部を抽出します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.