0

dos コマンドのみを使用してファイルをコピーして名前を変更しようとすると問題が発生します。形式のファイルがあり、myfile20130218コピーして名前をsome_other_file_20130218.

使用できることはわかっていますcopy source destが、日付を分離して保存する方法に問題があります。彼の日付が今日の日付であるとは保証できないため、それは除外されます。ソース ファイルは常に同じ名前になります。

一連のコマンドまたはバッチ スクリプトのいずれかを実行できますが、現在問題を抱えているのは、コピーする必要がある一致を見つけた後、 を使用してmyfile????????、これらのファイル名を取得して日付を取得する方法ですそれらから?

編集:明確にするために、上記のように、既知のディレクトリ内のファイルを調べます。ファイル名の形式を知っており、特定のディレクトリのみをチェックします。ディレクトリをチェックするプロセスは ConnectDirect ファイル ウォッチャーであるため、一致するファイルが見つかった場合、myfile20130218いくつかのコマンドを実行できますが、ディレクトリをチェックして存在するファイルの名前を取得する方法がわかりません。

4

1 に答える 1

2

このようなものが動作するはずです:

%oldname:~-8%最後の 8 文字を抽出し、そこから%oldname%新しいファイル名に追加します。

更新:外部プログラムでファイルを識別し、ファイル名でバッチスクリプトを呼び出すことができる場合

copyfile.cmd C:\path\to\myfile20130218

次のようなことができます。

set oldname=%~nx1
set newname=%~dp1some_other_file_%oldname:~-8%
copy "%~f1" "%newname%"

更新 2:フォルダーと形式がわかっている場合は、フォルダーを使用してスクリプトを呼び出すことができます

copyfile.cmd C:\folder

次のようにします。

@echo off

setlocal EnableDelayedExpansion

for /f %%f in (
  'dir /b "%~f1" ^| findstr /r "myfile[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"'
) do (
  set oldname=%~f1\%%f
  set newname=%~f1\my_other_name_!oldname:~-8!
  copy "!oldname!" "!newname!"
)

endlocal

編集:スクリプトの内訳。

  • setlocal EnableDelayedExpansionループおよび条件内での変数展開を有効にします。
  • for /f %%f in ('...')一重引用符の間でコマンドを実行し、そのコマンドの出力をループします。
  • dir /b "%~f1"指定されたディレクトリの内容を一覧表示し%~f1ます (スクリプトに渡された最初の引数のフル パスに展開されます)。簡易モード (ヘッダーなし、要約なし)。
  • findstr /r "myfile[0-9]...[0-9]$"部分文字列「myfile」で終わり、その後に 8 桁の数字が続く文字列の入力をフィルタリングします。パイプの前のサーカムフレックス ( ^|) は、パイプをエスケープします。そうしないと、コマンドよりも優先され、forコマンドが事実上for半分に分割され、無効なコマンド ラインが生成されるためです。
  • set oldname=%~f1\%%f一致するファイルへのフル パスを変数に割り当てますoldname
  • set newname=%~f1\my_other_name_!oldname:~-8!新しいファイル名へのフル パス ("my_other_name_" の後に からの末尾の 8 桁が続くoldname) を変数に割り当てますnewname
  • copy "!oldname!" "!newname!"これは説明しなくてもいいですよね?
于 2013-02-18T00:18:38.350 に答える