VS 2012: Post Build xcopy error 2
Asked Answered
W

3

20

i want to make VS copy the .lib-file it created after the build process to a specific folder. So i went to the project config, post-build event, and entered the following command:

if exist $(TargetPath)
xcopy "$(TargetPath)" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

But instead of copying the process fails after i click "build" and i receive the following error:

error MSB3073: The command "if exist C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\MyNetWorkProject\Debug\IncNetworkLibD.lib xcopy "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\MyNetWorkProject\Debug\IncNetworkLibD.lib" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

:VCEnd" exited with code 2.

I am also wondering about the :VCEnd in the command-string of the error message <- Maybe this is the reason? How to get this solved?

Any help and hints would be happily consumed :)...

partial solution:

EDIT: it looks like the renaming part (Inc.lib to z.lib) makes trouble, when xcopy asks whether this is a file or a directory...it works when i just copy the originally named file to a directory instead of copying renamed

Whichever answered 23/12, 2012 at 21:15 Comment(4)
Copy/paste the PostBuildEvent from your project file into your question. Don't edit it, make it look exactly the same way.Underage
it looks like the renaming part (Inc.lib to z.lib) makes trouble, when xcopy asks wether this is a file or a directory... this works when i just copy the lib-file to a directory without renaming it...Whichever
https://mcmap.net/q/77327/-why-does-the-command-xcopy-in-batch-file-ask-for-file-or-folder one possible way to resolve it. By echo f | xcopy ... you would just say 'file' to xcopy.Radiant
works, thx... if you post it as an answer i can mark the question as answered...Whichever
R
38

Xcopy documentation says the following:

Specifying whether Destination is a file or directory If Destination does not contain an existing directory and does not end with a backslash (\), the following message appears:

Does destination specify a file name 
or directory name on the target 
(F = file, D = directory)? 

Press F if you want the file or files to be copied to a file. Press D if you want the file or files to be copied to a directory.

You can suppress this message by using the /i command-line option, which causes xcopy to assume that the destination is a directory if the source is more than one file or a directory.

You need the opposite, but there is no such switch.

The solution is proposed here: https://mcmap.net/q/77327/-why-does-the-command-xcopy-in-batch-file-ask-for-file-or-folder.

It is suggested to prepend the xcopy command with echo f | prefix, which basically does the following: it simulates a user pressing f key when xcopy asks.

So your command should look like:

if exist $(TargetPath)
echo f | xcopy "$(TargetPath)" "C:\Users\Incubbus\Documents\Visual Studio 2010\My Libraries\z.lib" /Y

Operator | just pipes the output of echo f (== f) into xcopy command and it is read when appropriate. More information about output redirection here: http://ss64.com/nt/syntax-redirection.html.

UPDATE: As Govert points out, this hack won't work under a localized version of Windows. However, another hack will work:

xcopy D:\file.zip c:\renamedFile.zip*

Appending destination file name with an asterisk * makes xcopy not ask whether destination is a file or a directory.

Radiant answered 24/12, 2012 at 13:58 Comment(6)
This does not work under localised versions of Windows, where the prompt words might be different. An alternative trick is to add an asterisk '*' to the end of the destination, then xcopy won't prompt for File/Directory.Marela
Why does xcopy not recognize the source and/or target as a file when they have a file extension and why does the asterisk work? @MarelaPersonalize
@Personalize I have not idea how xcopy works. It might be a good question to ask Raymond Chen: blogs.msdn.com/b/oldnewthingMarela
@Personalize Having a dot and some characters after it doesn't make a path a file. Folders can have dot in name, i.e. aaa.txt is a valid folder name.Andantino
@Andantino Regardless, why does xcopy fail to identify a file as a file, and why does using an asterisk resolve that? (Thanks for the link, Govert)Personalize
@Personalize There's no file yet only a path and can't decide only based on path what is the target because folder names can have "extensions" a file names may not have extensions. Copying a file to a folder is a valid operation so can't decide on source either. xcopy seems to ignore wildcards for directories probably this is why a path with wildcard is considered to be a file. To avoid confusion and hacks use copy for files.Andantino
A
12

Why don't you use copy instead of xcopy? copy is specifically for files so there will be no confusion.

Andantino answered 8/10, 2014 at 17:22 Comment(1)
The absolutely simplest answer. THANK YOU.Wendling
N
1

Did you try wrapping the $(TargetPath) in quotes? The ever-so-popular-space-characters-instead-of-underscores-in-all-MS-products tend to mess things up at every corner... Dunno why those dumbos keep doing it...

Like so: if exist "$(TargetPath)"

Night answered 8/1, 2014 at 4:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.