0

システムの特定の機能を維持するために、主にデータの分析とアルゴリズムの検索からなる、より大きなプロジェクトに着手しました。

開始するために、残念ながら名前付けに関しては一貫性のない記録されたデータの束を取得しました。SPY.SPYNODE.SIDE通常、すべてのファイル (すべて 1 つのフォルダー内) は、値または変数ごとに特定の名前で始まり、その後に続く必要があります。ただし、データロガーはそれを数回台無しにし、奇妙な名前を付けましたSP0E1A~1.csv(すべてのファイルは .csv ファイルです)。

そのとき、数千のファイルの名前を手動で変更する代わりに、単純なバッチファイルを使用してその名前の仕事を「簡単に」実行できると考えました。そして、それはまさに私が夢中になり始めた時です:-)

これまでのところ、次のことを思いつきました。

FOR /R %%i in (%CD%) DO (
  set file1=%%i
  if not %file1%=="SPY.SPYNODE.SIDE" DO (
  set /p "filename" < %file1%
  rename %file1% %filename%
  )
)

だから私がやりたいのはこれです(疑似コードで)

look through the whole folder and every file
    save the filename in variable file1
    if file1 partially equals SPY.SPYNODE.SIDE
        open the file and save the first line (which contains the correct name of the file) in variable filename
        rename the file with the correct filename

しかし、これまでのところ実際には機能しておらず、その理由はわかりません。

どのように進めればよいですか?

4

2 に答える 2

0
@ECHO OFF
SETLOCAL
PUSHD \sourcedir
FOR /R %%i in (*.csv) DO (
 ECHO %%i|FIND /i "spy.spynode.side" >NUL
 IF ERRORLEVEL 1 (
  SET renme=Y
  FOR /f "delims=" %%r IN ('TYPE "%%i"') DO IF DEFINED renme SET "renme="&REN "%%i" "%%r.csv"
 )
)
POPD
GOTO :EOF

これはうまくいくはずです。

あなたの問題は、複合ステートメント(のようなFOR)で a%var%が解析時に変数 AT PARSE TIME の内容に置き換えられることです-そしてそれはFORキーワードから閉じ括弧までのステートメント全体に当てはまります。

これを回避する簡単な方法があります (「展開の遅延」の問題 - 非常に多くの SO 項目) が、この場合は必須ではありません。

まず、PUSHD必要なディレクトリに切り替えてから、FOR/Rすべての.CSVファイル名を取得して順番に適用します%%i

ECHO必要な文字列 ( = 大文字と小文字を区別しない) を入力すると、見つかった場合は 0 に設定さ%%iれます。それ以外の場合は非ゼロ。の結果のエコーを抑制します。FIND/iERRORLEVEL>nulFIND

が 1 以上の場合、形式IF ERRORLEVEL 1は TRUEであり、 によって設定されます。は の PARSE-TIME 値に置き換えられ、したがって不変であるため、ここでは機能しないことに注意してください。ERRORLEVELERRORLEVELFINDIF %ERRORLEVEL% GEQ 1%errorlevel%ERRORLEVEL

Y に設定renmeすると (まあ、どの値でも構いません)、ファイルから読み取られた最初の行に対して定義されていることが保証れます。その名前は便利です%%irenme、その後クリアされ、DEFINEDそのため、RENコマンドは最初の行に対してのみ実行されます。

.csvfilename-read にを追加するかどうかはわかりません。明らかに、必要ない場合は削除してください。

于 2013-11-11T14:57:22.357 に答える