Подтвердить что ты не робот

Файл BATCH запрашивает файл или папку

У меня есть простая копия от script для одного из наших парней, у которого отсутствует файл в 20 км от моего стола.

при тестировании script out Мне будет предложено, если мой файл 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
4b9b3361

Ответ 1

Похоже, что недокументированный трюк заключается в том, чтобы положить * в конец адресата - тогда xcopy будет копироваться как файл, например

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

Трюк echo f | xcopy ... не работает в локализованных версиях Windows, где приглашение отличается.

Ответ 2

На самом деле xcopy не спрашивает вас, существует ли исходный файл, но если вы хотите поместить его в новую папку с именем Shapes.atc или в папку Support (именно это вы хотите.

Чтобы предотвратить запрос xcopy, просто сообщите ему папку назначения, поэтому нет никакой двусмысленности:

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

Если вы хотите изменить имя файла в месте назначения, просто используйте копию (которая более адаптирована, чем xcopy при копировании файлов):

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

Ответ 3

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

Ответ 4

Реальный трюк: используйте обратную косую черту в конце целевого пути, где нужно скопировать файл. /Y - для перезаписи существующих файлов, если вы не хотите никаких предупреждений.

Пример:

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

Ответ 5

Переключатель/i может быть вашим после.

Из xcopy/?

/I Если адресата не существует и копируется более одного файла,            предполагает, что пункт назначения должен быть каталогом.

Ответ 6

Трюк добавления "*" можно заставить работать, когда новое расширение короче. Вам нужно заполнить новое расширение пробелами, что может быть сделано только путем включения имени целевого файла в кавычки. Например:

xcopy foo.shtml "foo.html *"

Это будет скопировать и переименовать без запроса.

"Это не ошибка, это особенность!" (Я когда-то видел VW Beetle на стоянке Microsoft с тщеславием "FEATURE".) Эти семантики для переименования полностью возвращаются к тому, когда я написал DOS v.1. Символы в новом имени заменяются один за другим для символов старого имени, если в новом имени отсутствует символ подстановки (? Или *). Без добавления пробела (ов) к новому имени оставшиеся символы копируются из старого имени.

Ответ 7

Хорошо, для задачи, заданной только мне, возможно, лучшим решением будет следующая команда в соответствии с неполным советом Энди Моррис:

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... quiet
  • /Y... yes (независимый от ОС язык) при перезаписывании существующего файла
  • /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, которые являются файлами без расширения файла, начиная с точки, чтобы скрыть их на * nix-системах. Командный процессор Windows интерпретирует такие файлы как файлы без имени файла и имеет только расширение файла из-за правила, что все после последней точки является расширением файла, а все до последней точки - это имя файла.

Для полного описания задачи и окончательного, полностью прокомментированного решения см. сообщение Создать резервную копию файлов в форуме UltraEdit.

Патрик, Tirtha R, Оператор-посредник и не работают, поскольку использование /Y не позволяет избежать запроса файла или каталога, если целевой файл еще не существует.

Энди Моррис и решения grenix не могут использоваться для задачи копирования одного файла как назначения должно быть имя файла назначения, а не имя целевого каталога. Целевой каталог совпадает с исходным каталогом, но имя целевого файла отличается от имени исходного файла.

DosMan и решения Govert просто не работают для файлов, начинающихся с точки и не имеющих расширение файла.

Например, команда

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

приводит к следующему сообщению об ошибке при выполнении:

Русский: Не удалось развернуть второе имя файла, чтобы он соответствовал первому.
German: Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt.

И наконец, решение Дениса Ивина имеет ограничение на то, что должен быть известен символ зависимого от операционной системы языка для автоматического ответа на приглашение каталога или каталога.

Итак, я подумал о методах получения F для Файл на английском языке Windows или D для Datei в немецкой Windows или ? для... на... Windows автоматически.

И действительно, можно определить язык, зависящий от языка, для автоматического ответа на приглашение.

Взломация используется для получения буквы, зависящей от языка, от текста подсказки без копирования файлов.

Команда XCOPY используется для начала копирования самого командного файла в папку для временных файлов с расширением файла, являющимся TMP для файла назначения. Это приводит к запросу XCOPY, если в файле временных файлов еще нет файла с таким именем, что маловероятно.

Обработчик устройства NULLиспользуется в качестве обработчика ввода для 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.

См. сообщение Создайте резервную копию файлов в форуме UltraEdit для аналогичного полностью комментируемого командного файла, объясняющего все части командного кода.

Для понимания используемых команд и того, как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

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

Далее следует прочитать статью Microsoft о Использование операторов перенаправления команд.

Ответ 8

Ссылка Файл 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

Для форматирования папки мы можем использовать параметр /i для xcopy или использовать обратную косую черту() в конце папки назначения.

Ответ 9

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\*.*"

.. должен это сделать.

Хорошая идея:

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

(при условии, что вы переименовали предыдущую версию в .old)

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

Ответ 10

Виртуальный родительский трюк

Предполагая, что у вас есть исходный и целевой файл в

%SRC_FILENAME% and %DST_FILENAME%

вы можете использовать двухэтапный метод:

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

это будет разрешено, например,

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\).

Я пришел к идее, когда я наткнулся на некоторые действительно дикие.. /..-constructs в командных строках, созданных в процессе сборки.

Ответ 11

У меня была точно такая же проблема, когда нужно скопировать файл на внешний жесткий диск для целей резервного копирования. Если бы я хотел скопировать полную папку, то COPY была вполне счастлива создать папку назначения и заполнить ее всеми файлами. Однако я хотел скопировать файл один раз в день и добавить сегодняшнюю дату в файл. COPY была счастлива скопировать файл и переименовать его в новом формате, но только до тех пор, пока папка назначения уже существует.

моя команда копирования выглядела так:

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

Как и вы, я искал альтернативные ключи или другие команды типа копирования, но ничего действительно не работало, как я этого хотел. Затем я подумал о разделении двух разных требований, просто добавив команду make directory (MD или MKDIR) перед командой копирования.

Итак, теперь у меня есть

MKDIR D:\DESTFOLDER

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

Если папка назначения НЕ существует, она создает ее. Если папка назначения существует, то она генерирует сообщение об ошибке.. НО, это не останавливает командный файл от выполнения команды копирования.

В сообщении об ошибке говорится: Подкаталог или файл D:\DESTFOLDER уже существует

Как я уже сказал, сообщение об ошибке не останавливает работу командного файла, и это действительно простое решение проблемы.

Надеюсь, что это поможет.