2016-09-11 2 views
1

나는이 주제에 관한 나의 마지막 질문에서 이미 Mofi가 준 답변을 시도했다. 하지만 기본 이름을 변경했는데 지금은 작동하지 않습니다. 이전 질문을 보려면 : How do I increment a filename in batch?이 새로운 코드에 어떤 문제가 있습니까? 새 파일을 만들지 않고 이전에 만든 파일을 덮어 씁니다.FileName을 일괄 적으로 증가시키는 방법은 무엇입니까? (Part2)

:MainProcessNew 
cd /D "%USERPROFILE%\Desktop" 
for /F %%G in (*.json) do ( 
set "FileName=%%G" 
set "BaseName=Device" 
set "FileNumber=0" 
) 

:FileNameLoop 
set /A FileNumber+=1 
if exist "%BaseName%%FileNumber%.json" (
goto FileNameLoop 
) 

echo.>"%USERPROFILE%\Desktop\%BaseName%%FileNumber%.json" 
+0

질문을 편집하고이 배치 파일을 한 번 실행 한 후 사용자의 바탕 화면 폴더에 포함 된 * .json 파일과 포함 할 * .json 파일을 추가 할 수 있습니까? 이 배치 코드가이 배치 파일을 실행할 때 활성화 된 사용자 계정의 바탕 화면 폴더에'Device1.json','Device2.json', ...을 생성해서는 안되는 이유가 없습니다. BTW : 관리자로 실행은 다른 사용자 계정으로 실행한다는 것을 의미합니다. – Mofi

+0

Desktop에 Device.json이라는 이름의 기존 .json 파일이 있지만 스크립트를 실행하면 방금 입력 한 새 데이터로 Device.json의 내용이 덮어 쓰기됩니다. –

+0

가능한 [ 배치?] (http://stackoverflow.com/questions/39201500/how-do-i-increment-a-filename-in-batch) – HaveNoDisplayName

답변

2

나는 문제의 배치 코드가 완료 또는 폴더 Desktop에 기존과 다른 Device*.json 파일이 존재하지 않습니다, 빈 라인 때문에 Device.json으로 문제를 재현하기 정말 적합하지 않은 스크립트 코드로 감소하지 않습니다 확신 해요 먼저 Device1.json에 기록됩니다. Device.json 이름의 파일은 변수 FileNumber이 항상 적어도 값 1을 갖기 때문에 문제의 배치 코드로 덮어 쓰지 않습니다. 내가 /F없이 수행으로 FOR 루프 * .json 파일을 검색해야 가정으로

음, 에 대한 옵션 /F 여기에 가장 가능성이 잘못된 것입니다. 옵션 오류 메시지 /F 결과와 함께 .json * 같은 와일드 카드 패턴을 사용하여 :

시스템은 파일 *의 .json을 찾을 수 없습니다. 명령 프롬프트 창을 for /? 또는이 명령의 구문에 도움을 help for에서

를 실행합니다.

FileName 변수가 전혀 사용되지 않았기 때문에 1301의 목적은 무엇입니까? 루프가 완전히 명확하지 않습니다. 이 변수는 * .json 파일이 전혀 발견되지 않으면 마지막으로 발견 된 * .json의 이름을 보유해야합니다. 그러나 더 이상 사용하지 않으면 그 의미가 없습니다.

BaseNameFileNumber이 루프 내부에 정의되어 있고 외부에 정의되어 있지 않은 이유도 분명하지 않습니다.

전체 배치 코드에서 FileNameLoop 레이블은 아마도 서브 루틴의 시작일 것입니다. 그러나 문제의 축소 배치 코드에는이 경우 기대할만한 것이 없습니다 call :FileNameLoop "%%G"입니다.

게시 된 배치 코드에 실제로 어떤 문제가 있는지 확실하지 않으므로 대답하기가 어렵습니다.

:MainProcessNew 
cd /D "%USERPROFILE%\Desktop" 

rem Useless FOR loop without /F commented out. 
rem for %%G in (*.json) do set "FileName=%%G" 

set "BaseName=Device" 
set "FileNumber=" 

rem Skip searching for files with a file number 
rem after Device if there is no Device.json file. 
if not exist "%BaseName%.json" goto CreateFile 

rem Otherwise keep Device.json as is and search for Device1.json, 
rem Device2.json, ... until a Device*.json file with current number 
rem is not found and use this number for next Device*.json file. 
set "FileNumber=0" 

:FileNameLoop 
set /A FileNumber+=1 
if exist "%BaseName%%FileNumber%.json" goto FileNameLoop 

:CreateFile 
rem Note: FileNumber is replaced in the line below by an empty 
rem  string if there is no Device.json in desktop folder. 
echo.>"%USERPROFILE%\Desktop\%BaseName%%FileNumber%.json" 

힌트 :

  1. 코멘트 배치 파일을 디버깅하거나 제거 모든 @echo off 또는 echo off을 배치 파일 또는 onoff,
  2. 명령 프롬프트 창을 열고 변경에 대한
  3. "Path to batch file\BachFileName.bat"을 입력하고 RETURN을 누릅니다.지금

이 명령 프롬프트 창에서 볼 수있는 각각의 라인과 현재 라인 또는 상기 변수의 현재 값에 의해 모든 %VariableName% 교환 후 수단 각각의 명령 블록 전처리 후 Windows 명령 프로세서 의해 실행되는 각 행 전체 명령 블록.

그리고 오류 메시지

또한 옵션 항상 현재 명령 프로세스를 종료 /B하지 않고 명령 exit을 포함 제외 프롬프트 창을 중지 배치 파일을 처리 한 후 열려 명령으로 볼 수있다.

+0

모든 의견이 맞는 것 같습니다. 루프에는 아무런 문제가 없습니다. 코드의 앞 부분에있는 레이블에 오류가 있습니다. 디버깅 팁에 대해 Mofi에게 다시 한 번 감사드립니다. 오류를 볼 수있었습니다. –

관련 문제