2012-11-11 5 views
6

私はNew_Folderという名前のフォルダといくつかのサブディレクトリとファイルを作成するバッチスクリプトを持っています。現在、複数のNew_Foldersを作成する必要がある場合は、再度実行して新しいものを作成する前に、そのバッチによって作成された各New_Folderの名前を変更する必要があります。私がしたいのは、バッチチェックをして、New_Folderがすでに存在するかどうかを確認し、そうであれば、New_Folderを数字でインクリメントすることです。だから私はNew_Folder、New_Folder1、New_Folder2などを持っていただろう。Windowsバッチを使用してフォルダ名を増やすにはどうすればよいですか?

どうすればいいですか?私がバッチスクリプトのものを増やすために見た解決策は、私の状況には当てはまりません。バッチスクリプトについては、私自身のコードのためにコピー/ペーストしたこと以外は何も知りません。

答えて

6

ここには、数字に隙間があっても常に機能するソリューションがあります。フォルダ番号は常に現在の最大番号より1大きい。

@echo off 
setlocal enableDelayedExpansion 
set "baseName=New_Folder" 
set "n=0" 
for /f "delims=" %%F in (
    '2^>nul dir /b /ad "%baseName%*."^|findstr /xri "%baseName%[0-9]*"' 
) do (
    set "name=%%F" 
    set "name=!name:*%baseName%=!" 
    if !name! gtr !n! set "n=!name!" 
) 
set /a n+=1 
md "%baseName%%n%" 
+0

それはそれをした!本当にありがとう! –

+0

は魅力的に機能します。ありがとう! –

3

これを使用すると、「New_Folder *」の出現回数を数え、次の数値で1つを作成することができます。

@echo off 
set /a count=0 

for /d %%d in (New_Folder*) do (
    set /a count+=1 
) 

set /a count+=1 

mkdir New_Folder%count% 

注最良の方法は、New_Folderの終わりに最大数を見つけるになりますが、Windowsのバッチは非常に限定的であると私は、Linuxの男だということ!

EDIT:グーグルと試験の約1時間後:注意を

@echo off 

setlocal EnableDelayedExpansion 

set max_number=0 

for /d %%d in (New_Folder*) do (
    set current_directory=%%~nxd 

    call:StrLength name_length !current_directory! 
    call:Substring directory_number,!current_directory!,10,!name_length! 

    if !directory_number! gtr !max_number! (
     set max_number=!directory_number! 
    ) 
) 

set /a max_number+=1 

mkdir New_Folder%max_number% 

:Substring 
::Substring(retVal,string,startIndex,length) 
:: extracts the substring from string starting at startIndex for the specified length 
SET string=%2% 
SET startIndex=%3% 
SET length=%4% 

if "%4" == "0" goto :noLength 
CALL SET _substring=%%string:~%startIndex%,%length%%% 
goto :substringResult 
:noLength 
CALL SET _substring=%%string:~%startIndex%%% 
:substringResult 
set "%~1=%_substring%" 
GOTO :EOF 

:StrLength 
::StrLength(retVal,string) 
::returns the length of the string specified in %2 and stores it in %1 
set #=%2% 
set length=0 
:stringLengthLoop 
if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop) 
::echo the string is %length% characters long! 
set "%~1=%length%" 
GOTO :EOF 

、コマンドラインは私にエラーを返す「コマンドの構文が正しくありません。」しかしすべてがうまくいくので、私はあなたに理由を知らせることができます...ディレクトリの順序に関係なく、または彼らが1で始まるかどうかに関係なく、新しいフォルダが作成されます:)あなたが楽しむことを願っています!

+0

私はあなたの最後の文章に同意します。ナンバリングに隙間があると、既存のソリューションが失敗する可能性があります。 – dbenham

+0

これはここです、アップデートを見てください! –

+0

ありがとう!コードがより簡潔であるため、私はdbenhamのソリューションを終了しましたが、あなたのコメントに感謝します。前にバッチスクリプトを使ったことはありませんでしたので、その背後にあるロジックを見てうれしいです! –

2

このソリューションでは、最大の番号の名前を見つけて、その横に1を作成します。

@echo off 
for /d %%d in (New_Folder*) do set lastFolder=%%d 
set /A nextFolder=%lastFolder:*New_Folder=% + 1 
mkdir New_Folder%nextFolder% 

EDIT:前のソリューションが正しく最後の番号のフォルダを得ることはありませんが、次の1です正しい:

@echo off 
setlocal EnableDelayedExpansion 
set lastFolder=0 
for /d %%d in (New_Folder*) do (
    set folder=%%d 
    set folder=!folder:New_Folder=! 
    if not defined folder set folder=0 
    if !folder! gtr !lastFolder! set lastFolder=!folder! 
) 
set /A nextFolder=lastFolder+1 
mkdir New_folder%nextFolder% 
+0

x9がx9より前にソートされているため、すでに10がある場合は動作しません。 – dbenham

+0

おっと!あなたは正しい、デイブ!私はそれを修正した... – Aacini

関連する問題