2016-07-08 8 views
1

基本的な質問:の名前変更フォルダ(まもなく) - バッチファイル

どのように私はものを行う、その後、(同じバッチで実行)最近作成したフォルダを取ることができますフォルダーをタイムスタンプで名前を変更し、新しいタイムスタンプを生成する新しいファイルを繰り返しますか?

私のバッチコードの概要と実績対期待:

私はそのディレクトリ内のすべてのファイルについては、以下の手順をループ、するバッチファイルを作成しています。

手順1(作業中):ディレクトリ内のファイルを移動してデータを抽出すると、このデータは「出力」(この手順で作成される)という名前の作成済みフォルダに出力されます。

ステップ2(作業中):この「出力」フォルダに移動し、データを「処理する」必要があります(すでに「出力」と「処理」の新しいファイルパスに入るスクリプトがあります) )

ステップ3(動作しない):「output_TimeStamp」(私の問題はある場所ですが、私のループが作成した最初のフォルダのタイムスタンプ#1を取り、すべてに名前をしようとすると、フォルダ「出力」を名前を変更フォルダのタイムスタンプ#1)

ステップ4(半加工):次のファイルを処理するためにステップ1に戻ります(すべてのファイルがディレクトリに完成するまでループします)

マイコード(私の試みのほかに少なくとも1)

::Loop to perform tasks on files in current directory 
for /R %%f in (*.mp4) do (

::Extracts data from file and leaves it in a created output folder 
start "" /w Sample.exe --clip "%%f" --verbose 2 --outDir output 

::This goes in created output folder and does stuff to data 
start "" /w C:\Users\user\Documents\winPython\WinPython-64bit-3.4.4.2\python-3.4.4.amd64\python.exe "%CD%\DoStuff.py" "%CD%\output\folder\folder2\Do.file" 

::This is supposed to rename the folder with a time stamp 
rename output output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2% 



::This is what my research came to, which increments a number in the timestamp but doesnt work 
set N=0 
set FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N% 
:loop 
set /a N+=1 
set FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N% 
if exist %FILENAME% goto :loop 

echo You can safely use this name %FILENAME% to create a new file 


) 

私の研究

私は、多くのものを試してみましたが、リンクHow do I increment a folder name using Windows batch?cmd line rename file with date and timeを使用しています。
私は、この質問を書いた方がずっと簡単だと思います。

+0

1.それはループコンテキストを破るようにループ 'goto'を使用しないでくださいは。 'goto'を含むコードとそのラベルを' call'サブルーチンに入れることができます。 2.予期しない結果につながる可能性があるので、ループ内の '::'コメント(実際に無効なラベルを構成する)を避ける。代わりに 'rem'を使用してください。 3. 'date'と' time'変数に対して[delayed expansion](http://ss64.com/nt/delayedexpansion.html)を有効にします。そうでないと、ループ全体が解析されたときに常に存在する値に展開されるためです。 – aschipfl

+0

@aschipflご返信ありがとうございます。私はあなたの変更を加えましたが、私はまだいくつかのハードルに直面しています。 [call]サブルーチンを使って何を意味するのか正確には分かりません。バッチを使用するのが非常に新しいです。私は他の変更を加えました。 – altairya

+0

の後に最後のフォルダの最後に増分する数字を追加する方法を教えてください。現在のコードを質問に投稿して、それがあなたの期待。正確なエラーメッセージが表示される場合は、それらを含めます。 – lit

答えて

0

スクリプトのロジックをチェックしない、私はすでにmy commentで述べた以下の問題修正:

  1. goto :Label休憩コードの括弧のブロックの文脈、あなたforループは、このようなブロックを構成します。実行は:Labelに進みますが、それはブロック内には存在しなくなります。 goto:Labelを含むコード部分をサブルーチンに置き、callコマンドで呼び出すことで回避できます。現在のブロックコンテキストをgotoから非表示にします。
  2. ::ループやその他のカッコで囲まれたコードブロック内でコメントを使用すると、予期しない動作が発生する可能性があります。彼らは実際に無効なラベルを構成します。代わりにremを使用してください。
  3. delayed expansionを有効にし、変数date,timeおよびFILENAMEに使用します。そうでないと、ループ全体が解析されたときに常に値が展開されるためです。

だからここに変更されたコードです:

setlocal EnableDelayedExpansion 

rem // Loop to perform tasks on files in current directory 
for /R %%f in (*.mp4) do (

    rem // Extracts data from file and leaves it in a created output folder 
    start "" /w "Sample.exe" --clip "%%f" --verbose 2 --outDir output 

    rem // This goes in created output folder and does stuff to data 
    start "" /w "C:\Users\user\Documents\winPython\WinPython-64bit-3.4.4.2\python-3.4.4.amd64\python.exe" "%CD%\DoStuff.py" "%CD%\output\folder\folder2\Do.file" 

    rem // This is supposed to rename the folder with a time stamp 
    rename "output" "output-!date:~4,2!-!date:~7,2!-!date:~10,4!_at_!time:~0,2!!time:~3,2!" 

    call :SUB 

    echo You can safely use this name !FILENAME! to create a new file 

) 
endlocal 
exit /B 


:SUB 
rem // This is what my research came to, which increments a number in the timestamp but doesnt work 
set /a N=0 
set "FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%" 
:loop 
set /a N+=1 
set "FILENAME=output-%date:~4,2%-%date:~7,2%-%date:~10,4%_at_%time:~0,2%%time:~3,2%.%N%" 
if exist "%FILENAME%" goto :loop 
exit /B 
+0

お世話になりました。あなたは、 "改名"行に説明ポイントを追加することで、私の問題を解決しました。私はcal:SUBのレッスンにも感謝しています。これは、私が今多く使用している非常に強力なテクニックです。 – altairya

関連する問題