5

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

どうすればこれを行うことができますか?バッチ スクリプトでインクリメントするために私が見た解決策は、私の状況には当てはまらないようです。また、バッチ スクリプトについては、自分のコードにコピー/貼り付けした以上のことは何も知りません。

4

3 に答える 3

8

数値にギャップがあっても、常に機能するソリューションを次に示します。フォルダ番号は、常に現在の最大数よりも 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%"
于 2012-11-11T06:24:42.460 に答える
3

これで、「New_Folder*」の出現回数を数えて、次の番号で作成することができます。

@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 Batch は非常に制限的であり、私は Linux 派です!

編集:約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から始まるかどうかに関係なく、新しいフォルダーが作成されます:)楽しんでいただければ幸いです!

于 2012-11-11T04:52:36.907 に答える
2

このソリューションは、最大の番号付きの名前を見つけて、次の名前を作成します。

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

編集:前のソリューションは最後の番号付きフォルダーを正しく取得しませんが、次のソリューションは正しいです:

@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%
于 2012-11-11T05:08:39.693 に答える