2017-02-22 16 views
0
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion 
cd "C:\Documents and Settings\John\Desktop\New\Interest\f2" 
Pushd "C:\Documents and Settings\John\Desktop\New\Interest\f2" 
Set Line#=26 
Set /A LOfs=24 -1, Len=34 - LOfs 
For %%A in (*.txt) do For /F "tokens=1* delims=:" %%B in (
    'Findstr /N ".*" "%%A" ^|Findstr "^%Line#%:"' 
) do if %errorlevel% == 0 Set "Line=%%C"&Ren "%%~fA" "!Line:~%LOfs%,%Len%! - %%A!"" 
Popd 

上記のテキストのある場所にあるファイルのファイル名を特定の位置に変更しようとしています。ディレクトリ内のテキストファイルのディレクトリ名のテキストファイル名を変更するバッチファイル

26行目が空白の場合は何もせず、ファイル名を変更しないでください。

私はどこかで間違っていて、サークルで回っています。

誰でも手助けできますか?

ありがとうございます。

+0

「do」条件の最後に2つの引用符があるのはなぜですか?これは、renコマンドを 'line'変数値に設定します。 – npocmaka

+1

'ErrorLevel'は'%ErrorLevel%== 0'を受け取ると思いますか? 'findstr'のもの? 'findstr'は新しい' cmd'インスタンスで 'for/F'によって実行されるので、これはうまく動作しません。さらに、 '!ErrorLevel!'には[遅延拡張](http://ss64.com/nt/delayedexpansion.html)が必要です。代わりに 'ErrorLevel 1でなければ'を使うこともできます。とにかく、#26行目をフィルタリングしているので、おそらく 'if' /' ErrorLevel'クエリは必要ありません。それにもかかわらず、例を挙げて、実際に何が起こったのかを記述する必要があります。 – aschipfl

+0

私はそれを考えました**%ErrorLevel%== 0 ** ** Findstr/N "。*" "%% A"^| Findstr "^%Line#%:**は空白行ではない場合に発生します。 – jaburmester

答えて

0

あなたのスクリプトがどのように失敗するかは明記していませんが、いくつかの潜在的な問題があります。私はまた、可能性のある単純化を見る。

  • あなたは確かに両方CDPUSHD
  • 私は数値変数を取り除くと、実際のコードの数字リテラルが含まれてしまっを必要としません。必要に応じて、変数に戻すことができます。
  • 外側にはループFORは必要ありません。 FINDSTRは、ファイル名にワイルドカードを使用すると複数のファイルを検索し、ファイル名に続けて:を出力します。したがって、/Nオプションを追加すると、出力はfilename:line#:textという形式になります。 2番目のFINDSTRを調整して、正しい行番号のみを返すことができます。
  • 空白行を無視するだけでは不十分です。名前の変更は、23文字目以降に有効なファイル名文字が1つ以上ある場合にのみ有効です。ファイル名は:*?/\<>、または|を含めることはできません。 (私はいくつか見逃しているかもしれない)。私はFOR /FのdelimsとFINDSTRの検索を調整して補正しました。
  • のような変数展開では、!が含まれ、遅延拡張が有効な場合は値が破損します。 !は、ファイル名に有効な文字です。したがって、遅延拡張はループ内でオンとオフを切り替える必要があります。

私はあなたが欲しいものをやると信じています。以下のコードは、リネームコマンドをエコーし​​ます。正しい結果が得られたら、renの前にECHOを削除します。

@echo off 
setlocal disableDelayedExpansion 
pushd "C:\Documents and Settings\John\Desktop\New\Interest\f2" 
for /f "tokens=1,3 delims=:*?\/<>|" %%A in (
    'findstr /n "^" "*.txt" ^| findstr "^[^:]*:26:.......................[^:*?\\/<>|]"' 
) do (
    set "old=%%A" 
    set "line=%%B" 
    setlocal enableDelayedExpansion 
    ECHO ren "!old!" "!line:~23,11! - !old!" 
    endlocal 
) 
popd 
+0

ヴァルスの使い方は、OPの私の答え[最初の非常によく似た質問](http://stackoverflow.com/questions/42278373/)に由来しています。彼はそこに多くの努力を示したり、完全な答えを表明したりしなかった。上記のコードは私の答え(そしていくつかのエラーが追加されました)から取られました。 – LotPings

+0

@LotPings - 興味深い歴史。ありがとう。 – dbenham

0

DAVESにアンわずかに異なる方法:

@Echo Off 

Set "SrcDir=%UserProfile%\Desktop\New\Interest\f2" 
Set "Mask=*.txt" 
Set "Line#=26" 
Set "LOfs=23" 
Set "Len=11" 

If /I Not "%CD%"=="%SrcDir%" Pushd "%SrcDir%"2>Nul&&(Set _=T)||Exit/B 

For /F "Tokens=1-2* Delims=:" %%A In ('FindStr/N "^" "%Mask%" 2^>Nul' 
) Do If "%%B"=="%Line#%" If Not "%%~C"=="" (Set "Line=%%C" 
    SetLocal EnableDelayedExpansion 
    If Not "!Line:~%LOfs%,%Len%!"=="" (
     If Not Exist "!Line:~%LOfs%,%Len%! - %%A" (
      Ren "%%A" "!Line:~%LOfs%,%Len%! - %%A")) 
    EndLocal) 

If "_"=="T" PopD 
+0

Compoのスクリプトで助けてもらえますか?** line!〜%LOfs%、%Len%!**を変数に渡して、テキストに/をスペースで置き換える必要があるかどうかを確認します。 ** set str = "!Line:%LOfs%、%Len%!" **そして** ECHO%str%**出力を取得する** ECHOはオフです**。もし私が** ECHO "!Line:〜%LOfs%、%Len%!" **出力が期待されます。すべての助けに感謝します。ありがとうございます – jaburmester

+0

それは技術的には異なる質問になるでしょう。私はあなたが正しい答えをマークし、あなたの新しい要件に固有の新しい質問を開始することをお勧めします。 – Compo

0

この方法はfindstr.exeを必要としたり、それを高速に実行する必要がありますので、setlocal/endlocalをトグルしません。また、for %%Afor /Fと組み合わせて、dirコマンドを変更した、すでに名前を変更したファイルを再処理することを回避します。また

@Echo off 
SetLocal EnableDelayedExpansion 

cd "C:\Documents and Settings\John\Desktop\New\Interest\f2" 
Set /A Line#=26, LOfs=24 -1, Len=34 - LOfs 

For /F "delims=" %%A in ('dir /A-D /B *.txt') do (

    rem Read the desired line from this file 
    (for /L %%i in (1,1,%Line#%) do set "Line=" & set /P "Line=") < "%%A" 

    if defined Line ECHO Ren "%%~fA" "!Line:~%LOfs%,%Len%! - %%A" 

) 

なお、このバッチファイルは、現在のディレクトリが自動的に回復される終了時に現在の1 setlocalコマンドが実行されたときに、そのpushd/popdコマンドはどちらか必要とされていません。

+0

もちろん、遅延拡張のトグルを避けることはできますが、ファイル名に '!'が含まれていると失敗します。また、私の手では、FINDSTRのソリューションは、SET/PでFOR/Lを使用するよりも26行目を見つけるのが約5倍高速です。 – dbenham

関連する問題