nircmd.exe を使用してバッチ for ループでファイル名 %~nF を設定する方法

nircmd.exe を使用してバッチ for ループでファイル名 %~nF を設定する方法

各ファイル名を反復処理し、文字列の一部を取得し、作成日と変更日を設定するバッチ ファイルを作成しようとしています。 dirpath は実際のパスのプレースホルダーであることに注意してください。

@echo off
setlocal enabledelayedexpansion
FOR /R dirpath %F in (*.*) DO (SET FNAME=%~nF SET MM=%FNAME:~0,2% SET DD=%FNAME:~2,2% SET YY=%FNAME:~4,2% nircmd.exe setfiletime %F "%DD% %MM%-20%YY% 00:00:00" "%DD%-%MM%-20%YY% 00:00:00")

スクリプトが何をしているのか、トラブルシューティングの方法さえわかりません。一時停止しても、ループ後にプログラムは一時停止しません。これを機能させるには、どのように書き直せばよいでしょうか?

答え1

これを書き直して機能させるにはどうすればよいでしょうか?

バッチ ファイルにはいくつかの問題があります:

  • 違います%f%%f代わりに を使用する必要があります。%fはコマンド ライン用であり、少なくとも 3 か所を修正する必要があります。
  • コマンドをdo ( ... )別々の行に配置します。
  • 終了前に一時停止することができます)
  • 最初の行をコメントアウトすると、remバッチ ファイルが何を実行しているかを確認できます。
  • echoペイロード行に を追加しますnircmd
  • echo動作していると思われる場合は削除します。
  • いくつかの場所ではループ内で!の代わりにを使用する必要があります(それがの目的です。これにより、解析時ではなく実行時に変数を展開できるようになります)。%forenabledelayedexpansion

次のバッチ ファイルから始めます (主な間違いは修正しておきました)。

@echo off
setlocal enabledelayedexpansion
for /r dirpath %%F in (*.*) DO (
  set FNAME=%%~nF
  SET MM=!FNAME:~0,2!
  SET DD=!FNAME:~2,2!
  SET YY=!FNAME:~4,2!
  echo nircmd.exe setfiletime %%F "!DD!-!MM!-20!YY! 00:00:00" "!DD!-!MM!-20!YY! 00:00:00"
  pause
  )
endlocal

参考文献

  • Windows CMD コマンドラインの AZ インデックス- Windows コマンド ラインに関連するあらゆることに関する優れたリファレンス。
  • 有効遅延拡張- 遅延展開では、変数は解析時ではなく実行時に展開されます。
  • /rの場合- ファイルをループします (サブフォルダーを再帰的に実行します)。
  • セット- CMD 環境変数を表示、設定、または削除します。SET で行われた変更は、現在の CMD セッションの期間中のみ保持されます。
  • ローカル設定- バッチ ファイル内の環境変数の可視性を制御するオプションを設定します。

答え2

単に関数を呼び出すことで別の解決策を見つけました。

FOR /R dirname %%F in (*.*) DO call :Setfiletime %%F
goto End
:Setfiletime
   SET FNAME=%~n1
   echo %FNAME%
   SET MM=%FNAME:~0,2%
   SET DD=%FNAME:~2,2%
   SET YY=%FNAME:~4,2%
   nircmd.exe setfiletime %1 "%DD%-%MM%-20%YY%" "%DD%-%MM%-20%YY%"
:goto :eof
:End

皆様のご協力に感謝いたします。

関連情報