batch-file - programacion - comandos batch avanzados
El archivo BATCH pide archivo o carpeta (11)
Tengo una copia simple de un guión para uno de nuestros muchachos a quien le falta un archivo a 20 km de mi escritorio
cuando pruebo el script me shapes.atc
si mi archivo shapes.atc
es un archivo o una carpeta
Puedo decirte que es un archivo, pero ¿cómo puedo autocopiarlo antes de que mi chico necesite poder hacer clic en el lote terminado?
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
Bueno, para la tarea que quizás la mejor solución sería la siguiente orden de acuerdo con el consejo incompleto de :
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
Esto funciona para esta sencilla tarea de copia de archivos debido a
- especificando solo el directorio de destino en lugar del archivo de destino y
- finalizando el directorio de destino con una barra inclinada invertida que es muy importante ya que, de lo contrario, XCOPY lo haría incluso
/I
solicite un archivo o directorio al copiar solo un archivo.
Los otros parámetros no relacionados con la pregunta son:
-
/Q
... tranquilo -
/Y
... sí (idioma del sistema operativo independiente) al sobrescribir el archivo existente -
/R
... sobrescribir también archivo de solo lectura, oculto y del sistema -
/S
... desde el directorio especificado y todos los subdirectorios.
Bueno, no sé si /S
es realmente necesario aquí porque no está claro si solo J:/My Name/FILES IN TRANSIT/JOHN20101126/Missing file/Shapes.atc
debería copiarse o todas las Shapes.atc
encontradas en Shapes.atc
parte del directorio árbol de J:/My Name/FILES IN TRANSIT/JOHN20101126/Missing file
.
La explicación de los parámetros se puede leer abriendo una ventana del símbolo del sistema y ejecutándose desde esta ventana xcopy /?
para obtener la ayuda de XCOPY .
Pero ninguna de las soluciones proporcionadas funcionaba para una tarea de copia de archivos en la que un solo archivo debería copiarse en el mismo directorio que el archivo fuente, pero con un nombre de archivo diferente debido a la fecha y hora actuales.
El archivo de origen puede tener ocultos o un conjunto de atributos del sistema que excluye el uso del comando COPY .
El archivo de proceso por lotes para crear el archivo con sello de tiempo también debería funcionar en Windows XP, que excluye ROBOCOPY porque, por defecto, no está disponible en Windows XP.
El archivo por lotes debería funcionar con cualquier archivo que incluya archivos no típicos como .gitconfig
o .htaccess
que son archivos sin una extensión de archivo que comienza con un punto para ocultarlos en los sistemas * nix. El procesador de comandos de Windows interpreta dichos archivos como archivos sin nombre de archivo y con solo una extensión de archivo debido a la regla de que todo después del último punto es la extensión del archivo y todo lo anterior al último punto es el nombre del archivo.
Para obtener una descripción completa de la tarea y la solución final totalmente comentada, consulte la publicación Crear una copia de seguridad de los archivos en el foro de UltraEdit.
CharlesB''s soluciones de Patrick''s , Tirtha R , Interociter Operator y CharlesB''s no funcionan porque el uso de /Y
no evita la solicitud del archivo o directorio si el archivo de destino aún no existe.
grenix''s soluciones de Andy Morris y grenix''s no se pueden usar para la tarea de copia de un solo archivo ya que el destino debe ser el nombre del archivo de destino y no el nombre del directorio de destino. El directorio de destino es el mismo que el directorio de origen, pero el nombre del archivo de destino es diferente al nombre del archivo de origen.
DosMan''s y Govert''s simplemente no funcionan para archivos que comienzan con un punto y no tienen una extensión de archivo.
Por ejemplo, el comando
xcopy C:/Temp/.gitconfig C:/Temp/.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y
da como resultado el siguiente mensaje de error en la ejecución:
Inglés: no se pudo expandir el segundo nombre de archivo para que coincida primero.
Alemán: Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt.
Y, finalmente, la solución de Denis Ivin tiene la restricción de que se debe conocer el carácter dependiente del idioma del sistema operativo para una respuesta automática del archivo O la solicitud del directorio.
Entonces, ¿pensé en los métodos para obtener F
para File en inglés Windows o D
para Datei en Windows alemán o ?
para ... en ... Windows automáticamente.
Y de hecho es posible determinar el carácter dependiente del idioma para una respuesta automática del aviso.
Se usa un truco para obtener la letra dependiente del idioma del texto del sistema sin copiar realmente ningún archivo.
El comando XCOPY se usa para comenzar a copiar el archivo por lotes en la carpeta de archivos temporales con la extensión de archivo que es TMP para el archivo de destino. Esto da como resultado un aviso de XCOPY si todavía no hay un archivo con ese nombre en la carpeta de archivos temporales, lo cual es muy poco probable.
El controlador del dispositivo NULL se usa como controlador de entrada para XCOPY, lo que da como resultado la interrupción del proceso de copia después de que XCOPY emitió el aviso dos veces.
Esta salida se procesa en un bucle FOR que se sale en la primera línea, comenzando con un paréntesis de apertura. Esta es la línea en la que el segundo carácter define la letra que se utilizará para especificar que el destino es un archivo.
Aquí hay un archivo por lotes usando XCOPY con el código para determinar la letra requerida para una respuesta automática de la solicitud del archivo o directorio para crear una copia sellada con el tiempo de un solo archivo en el mismo directorio que el archivo fuente incluso si el archivo fuente está oculto o archivo de sistema e incluso si el archivo de origen comienza con un punto y no tiene una extensión de archivo.
@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.
)
Este código de lote fue probado en alemán Windows XP SP3 x86 e inglés Windows 7 SP1 x64.
Ver la publicación Cree una copia de seguridad de los archivos en el foro de UltraEdit para obtener un archivo por lotes similar y completamente comentado que explique todas las partes del código del lote.
Para comprender los comandos utilizados y cómo funcionan, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea con atención todas las páginas de ayuda que se muestran para cada comando.
-
del /?
-
echo /?
-
exit /?
-
for /?
-
goto /?
-
if /?
-
rem /?
-
set /?
-
setlocal /?
-
wmic OS get /?
-
xcopy /?
Además, también se debe leer el artículo de Microsoft sobre el uso de operadores de redirección de comandos .
El modificador / i podría ser lo que buscas.
¿De xcopy /?
/ I Si el destino no existe y copia más de un archivo, se supone que el destino debe ser un directorio.
El truco de agregar "*" puede funcionar cuando la nueva extensión es más corta. Debe rellenar la nueva extensión con espacios en blanco, lo cual solo se puede hacer adjuntando el nombre del archivo de destino entre comillas. Por ejemplo:
xcopy foo.shtml "foo.html *"
Esto se copiará y cambiará de nombre sin preguntar.
"¡Eso no es un error, es una característica!" (Una vez vi un VW Beetle en el estacionamiento de Microsoft con la placa de la vanidad "FEATURE".) Esta semántica para cambiar el nombre se remonta a cuando escribí DOS v.1. Los caracteres del nuevo nombre se sustituyen uno por uno por los caracteres del nombre anterior, a menos que haya un carácter comodín (? O *) en el nuevo nombre. Sin agregar los espacios en blanco al nuevo nombre, los caracteres restantes se copian del nombre anterior.
El verdadero truco es: use una barra diagonal inversa al final de la ruta de destino donde copiar el archivo. El / Y es para sobrescribir archivos existentes, si no quiere advertencias.
Ejemplo:
xcopy /Y "C:/file/from/here.txt" "C:/file/to/here/"
En realidad, xcopy no le pregunta si el archivo original existe, pero si desea ponerlo en una nueva carpeta llamada Shapes.atc, o en la carpeta Support (que es lo que quiere).
Para evitar que xcopy pregunte esto, simplemente dígale la carpeta de destino, por lo que no hay ambigüedad:
xcopy /s/y "J:/Old path/Shapes.atc" "C:/Documents and Settings/his name/Support"
Si desea cambiar el nombre de archivo en el destino, simplemente use copy (que está más adaptado que xcopy al copiar archivos):
copy /y "J:/Old path/Shapes.atc" "C:/Documents and Settings/his name/Support/Shapes-new.atc
Tenía exactamente el mismo problema, donde se quiere copiar un archivo en un disco duro externo para fines de copia de seguridad. Si quería copiar una carpeta completa, COPY estaba feliz de crear la carpeta de destino y llenarla con todos los archivos. Sin embargo, quería copiar un archivo una vez al día y agregar la fecha de hoy al archivo. COPY estaba feliz de copiar el archivo y cambiarle el nombre en el nuevo formato, pero solo mientras la carpeta de destino ya existiera.
Mi comando de copia se veía así:
COPY C: / SRCFOLDER / MYFILE.doc D: / DESTFOLDER / MYFILE_YYYYMMDD.doc
Al igual que usted, busqué alternativas de interruptores u otros comandos de tipo de copia, pero nada funcionó como yo quería. Luego pensé en dividir los dos requisitos diferentes simplemente agregando un comando de directorio de creación (MD o MKDIR) antes del comando de copia.
Entonces ahora tengo
MKDIR D: / DESTFOLDER
COPY C: / SRCFOLDER / MYFILE.doc D: / DESTFOLDER / MYFILE_YYYYMMDD.doc
Si la carpeta de destino NO existe, entonces la crea. Si la carpeta de destino EXISTE, entonces genera un mensaje de error ... PERO, esto no impide que el archivo por lotes continúe con el comando de copia.
El mensaje de error dice: Ya existe un subdirectorio o archivo D: / DESTFOLDER
Como he dicho, el mensaje de error no detiene el funcionamiento del archivo por lotes y es una solución realmente simple al problema.
Espero que esto ayude
Un truco aparentemente indocumentado es poner un *
al final del destino - entonces xcopy
lo copiará como un archivo, como ese
xcopy c:/source/file.txt c:/destination/newfile.txt*
El echo f | xcopy ...
echo f | xcopy ...
truco no funciona en las versiones localizadas de Windows, donde el mensaje es diferente.
Hacer referencia al archivo XCopy Force
Para forzar archivos, podríamos usar la canalización "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
Para forzar una carpeta, podríamos usar el parámetro / i para xcopy o usando una barra invertida () al final de la carpeta de destino.
El truco virtual de los padres
Suponiendo que tiene su archivo de origen y destino en
%SRC_FILENAME% and %DST_FILENAME%
podrías usar un método de 2 pasos:
@REM on my win 7 system mkdir creates all parent directories also
mkdir "%DST_FILENAME%/.."
xcopy "%SRC_FILENAME% "%DST_FILENAME%/.."
esto se resolvería, por ejemplo,
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/).
Llegué a la idea cuando tropecé con algunas construcciones .../..- salvajes en las líneas de comando generadas a partir de un proceso de compilación.
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
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/*.*"
..Deberías hacerlo.
Buena idea para hacer un:
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
(suponiendo que haya hecho un cambio de nombre de la versión anterior a .old)
XCOPY /Z <----- restartable mode - good for large files.