Programing

BATCH 파일은 파일 또는 폴더를 요구합니다.

lottogame 2020. 10. 31. 09:11
반응형

BATCH 파일은 파일 또는 폴더를 요구합니다.


이 질문에 이미 답변이 있습니다.

내 책상에서 20km 떨어진 파일을 놓친 우리 직원 중 한 명을 위해 스크립트로의 간단한 사본이 있습니다.

스크립트를 테스트 할 때 내 파일 shapes.atc이 파일인지 폴더인지 묻는 메시지가 표시됩니다.

파일이라고 말할 수는 있지만 어떻게 자동 복사를 할 수 있습니까?

xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc

문서화되지 않은 것처럼 보이는 트릭은 *대상 끝에 a를 넣는 xcopy것입니다. 그러면 다음 과 같이 파일로 복사됩니다.

xcopy c:\source\file.txt c:\destination\newfile.txt*

echo f | xcopy ...트릭은 프롬프트가 다른 지역화 된 Windows 버전에서는 작동하지 않습니다.


실제로 xcopy는 원본 파일이 존재하는지 묻지 않지만 Shapes.atc라는 새 폴더 또는 Support 폴더 (원하는.

xcopy가이를 묻지 않도록하려면 대상 폴더를 알려 주기만하면 모호함이 없습니다.

xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support"

대상에서 파일 이름을 변경하려면 copy를 사용하십시오 (파일을 복사 할 때 xcopy보다 더 적합합니다) :

copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc

echo f | xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc

진짜 트릭은 : 파일을 복사 할 대상 경로 끝에 백 슬래시를 사용하는 것입니다. / Y는 경고를 원하지 않는 경우 기존 파일을 덮어 쓰기위한 것입니다.

예:

xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\"

XCopy Force 파일 참조

강제 파일의 경우 파이프 라인 "echo F |"를 사용할 수 있습니다. :

C:\Trash>xcopy 23.txt 24.txt
Does 24.txt specify a file name
or directory name on the target
(F = file, D = directory)?

C:\Trash>echo F | xcopy 23.txt 24.txt
Does 24.txt specify a file name
or directory name on the target
(F = file, D = directory)? F
C:23.txt
1 File(s) copied

폴더를 강제하려면 xcopy에 / i 매개 변수를 사용하거나 대상 폴더의 끝에 백 슬래시 ()를 사용할 수 있습니다.


/ i 스위치는 당신의 후일 수 있습니다.

xcopy에서 /?

/ I 대상이 존재하지 않고 둘 이상의 파일을 복사하는 경우 대상이 디렉터리 여야한다고 가정합니다.


글쎄, 나만 요청한 작업에 대해 아마도 최선의 해결책은 Andy Morris 의 불완전한 조언에 따라 다음 명령이 될 것입니다 .

xcopy "J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc" "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\" /Q /R /S /Y

이 간단한 파일 복사 작업에는 다음과 같은 이유로 작동합니다.

  • 대상 파일 대신 대상 디렉토리 만 지정하고
  • 백 슬래시로 대상 디렉토리를 끝내는 것은 매우 중요합니다. 그렇지 않으면 XCOPY/I단일 파일 만 복사 할 때 파일 또는 디렉토리에 대한 프롬프트를 표시하는 경우에도 마찬가지입니다 .

질문과 관련이없는 다른 매개 변수는 다음과 같습니다.

  • /Q ... 조용히
  • /Y ... 예 (OS 언어 독립적) 기존 파일 덮어 쓰기시
  • /R ... 읽기 전용, 숨김 및 시스템 파일도 덮어 쓰기
  • /S ... 지정된 디렉토리 및 모든 하위 디렉토리에서.

글쎄요, /S그냥 J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc복사해야하는지 아니면 Shapes.atc디렉토리 트리의 모든 곳에서 찾을 수 있는지 명확하지 않기 때문에 여기에 정말 필요한지 모르겠습니다 J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file.

매개 변수에 대한 설명은 명령 프롬프트 창 xcopy /?열고이 창에서 실행 하여 XCOPY에 대한 도움말을 출력하여 읽을 수 있습니다 .


그러나 제공된 솔루션 중 어느 것도 단일 파일을 소스 파일과 동일한 디렉토리에 복사해야하지만 현재 날짜와 시간이 파일 확장명 앞에 파일 이름에 삽입되기 때문에 다른 파일 이름으로 파일 복사 작업에 대해 작동하지 않았습니다.

소스 파일은 COPY 명령 의 사용을 제외하는 숨김 또는 시스템 속성 세트를 가질 수 있습니다 .

타임 스탬프 파일을 만들기위한 배치 파일은 기본적으로 Windows XP에서 사용할 없기 때문에 ROBOCOPY 를 제외하는 Windows XP에서도 작동해야합니다 .

배치 파일이 아닌 일반적인 같은 파일을 포함한 모든 파일과 함께 작동합니다 .gitconfig또는 .htaccess* 괜찬아 시스템에 숨길 수있는 점으로 시작하는 파일 확장자없이있는 파일. Windows 명령 프로세서는 마지막 지점 이후의 모든 항목이 파일의 확장명이고 마지막 지점 이전의 모든 항목이 파일 이름이라는 규칙 때문에 파일 이름이없고 파일 확장명 만있는 파일로 이러한 파일을 해석합니다.

전체 작업 설명과 완전히 주석 처리 된 최종 솔루션은 UltraEdit 포럼에서 파일의 백업 복사본 생성 게시물을 참조하십시오 .

Patrick 's , Tirtha R 's , Interociter Operator 'sCharlesB의 솔루션은 /Y대상 파일이 아직없는 경우를 사용 하면 파일 또는 디렉토리 프롬프트를 피하지 않기 때문에 작동 하지 않습니다.

Andy Morrisgrenix의 솔루션은 단일 파일 복사 작업에 사용할 수 없습니다. 대상은 대상 디렉터리의 이름이 아닌 대상 파일의 이름이어야하기 때문입니다. 대상 디렉터리는 원본 디렉터리와 동일하지만 대상 파일의 이름은 원본 파일의 이름과 다릅니다.

DosManGovert의 솔루션은 파일 확장자가없는 포인트로 시작하는 파일에 대해서는 작동하지 않습니다.

예를 들어 명령

xcopy C:\Temp\.gitconfig C:\Temp\.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y

실행시 다음 오류 메시지가 표시됩니다.

영어 : 첫 번째와 일치하도록 두 번째 파일 이름을 확장 할 수 없습니다.
독일어 : Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt.

마지막으로 Denis Ivin의 솔루션에는 파일 또는 디렉토리 프롬프트의 자동 응답을위한 운영 체제 언어 종속 문자를 알아야한다는 제한이 있습니다.

그래서 얻을 수 방법에 대해 생각 F하기위한 파일 영어 Windows에서 나 D에 대한 Datei 독일어 Windows에서 나 ?에 대한 ...에 ... 윈도우 자동.

그리고 프롬프트의 자동 응답을 위해 언어 종속 문자를 결정하는 것이 실제로 가능합니다.

해킹은 실제로 파일을 복사하지 않고 프롬프트 텍스트에서 언어 종속 문자를 가져 오는 데 사용됩니다.

XCOPY 명령 은 배치 파일 자체를 대상 파일의 파일 확장자가 TMP 인 임시 파일의 폴더에 복사하기 시작하는 데 사용됩니다. 이로 인해 가능성이 거의없는 임시 파일 폴더에 해당 이름의 파일이 아직없는 경우 XCOPY에 의해 프롬프트가 표시됩니다 .

장치 NUL의 핸들러는 XCOPY에 대한 입력 핸들러로 사용되어 프롬프트가 XCOPY에 의해 두 번 출력 된 후 복사 프로세스가 중단 됩니다.

이 출력은 여는 괄호로 시작하는 첫 번째 줄에서 종료되는 FOR 루프 에서 처리 됩니다. 두 번째 문자가 대상이 파일임을 지정하는 데 사용할 문자를 정의하는 행입니다.

다음은 소스 파일이 숨겨져 있거나 소스 파일이 숨겨진 경우에도 소스 파일과 동일한 디렉토리에 단일 파일의 타임 스탬프 사본을 만들기 위해 파일 또는 디렉토리 프롬프트의 자동 응답에 필요한 문자를 결정하는 코드와 함께 XCOPY사용하는 배치 파일 입니다. 소스 파일이 점으로 시작하고 파일 확장자가없는 경우에도 마찬가지입니다.

@echo off
rem Batch file must be started or called with name of a single file.

if "%~1" == "" exit /B
for /F "delims=*?" %%I in ("#%~1#") do if not "%%I" == "#%~1#" exit /B
if not exist "%~1" exit /B
if exist "%~1\" exit /B
setlocal EnableDelayedExpansion

rem Determine the character needed for answering prompt of
rem XCOPY for destination being a file and not a directory.

del /F "%TEMP%\%~n0.tmp" 2>nul
for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%~f0" "%TEMP%\%~n0.tmp" ^<nul') do (
    set "PromptAnswer=%%I"
    if "!PromptAnswer:~0,1!" == "(" (
        set "PromptAnswer=!PromptAnswer:~1,1!"
        goto CopyFile
    )
)
echo ERROR: Failed to determine letter for answering prompt of XCOPY.
exit /B

:CopyFile
rem This is a workaround for files starting with a point and having no
rem file extension like many hidden files on *nix copied to Windows.

if "%~n1" == "" (
    set "FileNameWithPath=%~dpx1"
    set "FileExtension="
) else (
    set "FileNameWithPath=%~dpn1"
    set "FileExtension=%~x1"
)

rem Get local date and time in region and language independent format YYYYMMDDHHmmss
rem and reformat the local date and time to format YYYY-MM-DD_HH-mm-ss.

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS get LocalDateTime /format:value') do set "LocalDateTime=%%I"
set "LocalDateTime=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2%_%LocalDateTime:~8,2%-%LocalDateTime:~10,2%-%LocalDateTime:~12,2%"

rem Do the copy with showing what is copied and with printing success or
rem an error message if copying fails for example on sharing violation.

echo Copy "%~f1" to "%FileNameWithPath%_%LocalDateTime%%FileExtension%"

for /F %%I in ('echo %PromptAnswer% ^| %SystemRoot%\System32\xcopy.exe "%~f1" "%FileNameWithPath%_%LocalDateTime%%FileExtension%" /C /H /K /Q /R /V /Y') do set "FilesCopied=%%I"

if "%FilesCopied%" == "1" (
    echo Success
) else (
    echo ERROR: Copying failed, see error message above.
)

이 배치 코드는 독일어 Windows XP SP3 x86 및 영어 Windows 7 SP1 x64에서 테스트되었습니다.

See the post Create a backup copy of files in UltraEdit forum for a similar, fully commented batch file explaining all parts of the batch code.

For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.

  • del /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
  • wmic OS get /?
  • xcopy /?

Further the Microsoft article about Using command redirection operators should be read, too.


The trick of appending "*" can be made to work when the new extension is shorter. You need to pad the new extension with blanks, which can only be done by enclosing the destination file name in quotes. For example:

xcopy foo.shtml "foo.html *"

This will copy and rename without prompting.

"That's not a bug, it's a feature!" (I once saw a VW Beetle in the Microsoft parking lot with the vanity plate "FEATURE".) These semantics for rename go all the way back to when I wrote DOS v.1. Characters in the new name are substituted one by one for characters in the old name, unless a wildcard character (? or *) is present in the new name. Without adding the blank(s) to the new name, remaining characters are copied from the old name.


xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\*.*"

..should do it.

Good idea to do an:

IF NOT EXIST "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\Shapes.atc" ECHO/ && ECHO/ && ECHO * * * * * COPY FAILED - Call JustME at 555-555-1212 && ECHO/ && pause

(assuming you've done a rename of previous version to .old)

XCOPY  /Z  <----- restartable mode - good for large files.

The virtual parent trick

Assuming you have your source and destination file in

%SRC_FILENAME% and %DST_FILENAME%

you could use a 2 step method:

@REM on my win 7 system mkdir creates all parent directories also
mkdir "%DST_FILENAME%\.."
xcopy "%SRC_FILENAME% "%DST_FILENAME%\.."

this would be resolved to e.g

mkdir "c:\destination\b\c\file.txt\.."
@REM The special trick here is that mkdir can create the parent
@REM directory of a "virtual" directory (c:\destination\b\c\file.txt\) that 
@REM doesn't even need to exist.
@REM So the directory "c:\destination\b\c" is created here.
@REM mkdir "c:\destination\b\c\dummystring\.." would have the same effect

xcopy "c:\source\b\c\file.txt" "c:\destination\b\c\file.txt\.."
@REM xcopy computes the real location of  "c:\destination\b\c\file.txt\.."
@REM which is the now existing directory "c:\destination\b\c"
@REM (the parent directory of the "virtual" directory c:\destination\b\c\file.txt\).

I came to the idea when I stumbled over some really wild ../..-constructs in the command lines generated from a build process.


I had exactly the same problem, where is wanted to copy a file into an external hard drive for backup purposes. If I wanted to copy a complete folder, then COPY was quite happy to create the destination folder and populate it with all the files. However, I wanted to copy a file once a day and add today's date to the file. COPY was happy to copy the file and rename it in the new format, but only as long as the destination folder already existed.

my copy command looked like this:

COPY C:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_YYYYMMDD.doc

Like you, I looked around for alternative switches or other copy type commands, but nothing really worked like I wanted it to. Then I thought about splitting out the two different requirements by simply adding a make directory ( MD or MKDIR ) command before the copy command.

So now i have

MKDIR D:\DESTFOLDER

COPY C:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_YYYYMMDD.doc

If the destination folder does NOT exist, then it creates it. If the destination folder DOES exist, then it generates an error message.. BUT, this does not stop the batch file from continuing on to the copy command.

The error message says: A subdirectory or file D:\DESTFOLDER already exists

As i said, the error message doesn't stop the batch file working and it is a really simple fix to the problem.

Hope that this helps.

참고URL : https://stackoverflow.com/questions/4283312/batch-file-asks-for-file-or-folder

반응형