Make relative path in batch file

I have a batch file in which I will not know what drive letter will be, as I will be moving along a long path.

For example: adobe files are located in: J: \ Files \ New folder \ USB \ Adob

The batch file is executed from: J: \ Files \ New folder \ USB \ USBSTICK

So, I tried the code:

xcopy /s /y "%~dp0\..\..\USB\Adob\*" "C:\Program Files\" 

But he will not copy files. How can I get it dynamic?

+6
path batch-file xcopy
source share
4 answers

Because the letter with the disk seems to be a relative part of your script. I believe this should work better for you if I do not understand you.

 xcopy /s /y "%~d0\Files\New folder\USB\Adob\*" "C:\Program Files\" 

To get additional variables that you can use, follow these steps:
From CMD, enter for /? and read from below.

 %~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string The modifiers can be combined to get compound results: %~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only %~dp$PATH:I - searches the directories listed in the PATH environment variable for %I and expands to the drive letter and path of the first one found. %~ftzaI - expands %I to a DIR like output line In the above examples %I and PATH can be replaced by other valid values. The %~ syntax is terminated by a valid FOR variable name. Picking upper case variable names like %I makes it more readable and avoids confusion with the modifiers, which are not case sensitive. 
+2
source share

Try without "\", as it is part of% ~ dp0. I mean that the contents of% ~ dp0 always end with the "\" character.

Example:

 xcopy /s /y "%~dp0..\..\USB\Adob\*" "C:\Program Files\" 

Edit

Just in case...

  is Adob\* or Adob\*.* ?? 
0
source share

From my understanding of your hierarchy, this will also work:

 xcopy /s /y "..\Adob\*" "C:\Program Files\" 

since J:\Files\New folder\USB is a common prefix, and you run the batch file from J:\Files\New folder\USB\USBSTICK , this should work no matter what drive letter you are dealing with.

0
source share

I am not sure I fully understand your problem. But it seems to me that there are several solutions that could solve the problem, as far as I understand it.

If the paths are always fixed, but only the drive letter may differ, you can simply use the relative path:

 xcopy /s /y "..\Adob\*" "C:\Program Files\" 

Calling a batch program from any drive will work as expected if the batch file always exists in USBSTICK, which exists in the same directory as Adob.

If the original path can change, simply replace the variable part with the parameter and call the batch file with the correct path:

 xcopy /s /y "%1\*" "C:\Program Files\" 

Calling a batch program from any drive and location will work as expected when you deliver it with the correct path:

 xcopybatch J:\Files\New folder\USB\Adob 
0
source share

All Articles