need help regarding delete task in nant or command which can be used in nant build file.
here is the requirement, i have multiple files and folders in a root folder.
i need to delete only folders but not files..
Any idea how to do this.
Blockquote
EX : ROOT
-a.txt
-b.txt
-Folder1
-Folder2
after deletion, it should be
Blockquote
EX: ROOT-
-a.txt
-b.txt
Thanks in advance.
for /d %%a in ("c:\some\root\*") do echo rmdir /s /q "%%~fa"
For each folder inside the indicated path, matching the indicated mask, remove the folder
Delete operations are echoed to console. If the output is correct, remove the echo command to execute the rmdir commands.
To include it in a build file, and avoid problems with quoting, it is better to create a batch file to contain the command and call this batch file. That way, the batch file will be something like
#echo off
if "%~1"=="" exit /b 1
for /d %%a in ("%~1\*") do echo rmdir /s /q "%%~fa"
With the path to the folder to clean passed as argument
Then, the exec task will be something like
<exec program="cmd.exe" commandline="/c theBatchFile.cmd" workingdir="${project.batchFiles}" output="e:\my.txt">
<arg value="${project.rootFolder}" />
</exec>
The variables will need to be defined pointing to
${project.batchFiles} = where the batch file is located
${project.rootFolder} = the folder that needs to be cleaned
So, the task will call cmd.exe to process the batch file, passing the folder as argument to the batch.
used the above suggustions and found it out :
Code :
<echo file="CleanFolders.bat">for /d %%a in ("${dir}\subdir\*") do rmdir /s /q "%%~fa</echo>
<exec program="CleanFolders.bat"/>
I currently have
<PropertyGroup>
<PostBuildEvent>copy "$(TargetPath)" "$(SolutionDir)Shared.Lib\$(TargetFileName)"</PostBuildEvent>
</PropertyGroup>
I want to do something like this, but one level above $(SolutionDir)
You can use ..\ to move up a directory.
<PropertyGroup>
<PostBuildEvent>copy "$(TargetPath)" "$(SolutionDir)..\Shared.Lib\$(TargetFileName)"</PostBuildEvent>
</PropertyGroup>
Solution:
copy "$(TargetPath)" "$(SolutionDir)"..\"Shared.Lib\$(TargetFileName)"
If you have ..\ within the quotation marks, it will take it as literal instead of running the DOS command up one level.
This is not working in VS2010 .. is not resolved but becomes part of the path
Studio is running command something like this copy drive$:\a\b\bin\debug drive$:\a\b..\c
In .Net Core edit csproj file:
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy /Y "$(TargetPath)" "$(SolutionDir)"..\"lib\$(TargetFileName)"" />
</Target>
/Y Suppresses prompting to confirm you want to overwrite an existing destination file.
xcopy "$(TargerDir)." "$(SolutionDir)..\Installer\bin\"
Note: "../" is used for One level up folder structure
I work with multiple projects, and I want to recursively delete all folders with the name 'bin' or 'obj' that way I am sure that all projects will rebuild everything (sometimes it's the only way to force Visual Studio to forget all about previous builds).
Is there a quick way to accomplish this (with a .bat file for example) without having to write a .NET program?
This depends on the shell you prefer to use.
If you are using the cmd shell on Windows then the following should work:
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S bin') DO RMDIR /S /Q "%%G"
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S obj') DO RMDIR /S /Q "%%G"
If you are using a bash or zsh type shell (such as git bash or babun on Windows or most Linux / OS X shells) then this is a much nicer, more succinct way to do what you want:
find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf
and this can be reduced to one line with an OR:
find . -iname "bin" -o -iname "obj" | xargs rm -rf
Note that if your directories of filenames contain spaces or quotes, find will send those entries as-is, which xargs may split into multiple entries. If your shell supports them, -print0 and -0 will work around this short-coming, so the above examples become:
find . -iname "bin" -print0 | xargs -0 rm -rf
find . -iname "obj" -print0 | xargs -0 rm -rf
and:
find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf
If you are using Powershell then you can use this:
Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
as seen in Robert H's answer below - just make sure you give him credit for the powershell answer rather than me if you choose to up-vote anything :)
It would of course be wise to run whatever command you choose somewhere safe first to test it!
I found this thread and got bingo. A little more searching turned up this power shell script:
Get-ChildItem .\ -include bin,obj -Recurse | ForEach-Object ($_) { Remove-Item $_.FullName -Force -Recurse }
Or more terse:
gci -include bin,obj -recurse | remove-item -force -recurse
I thought I'd share, considering that I did not find the answer when I was looking here.
This worked for me:
for /d /r . %%d in (bin,obj) do #if exist "%%d" rd /s/q "%%d"
Based on this answer on superuser.com
I wrote a powershell script to do it.
The advantage is that it prints out a summary of deleted folders, and ignored ones if you specified any subfolder hierarchy to be ignored.
I use to always add a new target on my solutions for achieving this.
<Target Name="clean_folders">
<RemoveDir Directories=".\ProjectName\bin" />
<RemoveDir Directories=".\ProjectName\obj" />
<RemoveDir Directories="$(ProjectVarName)\bin" />
<RemoveDir Directories="$(ProjectVarName)\obj" />
</Target>
And you can call it from command line
msbuild /t:clean_folders
This can be your batch file.
msbuild /t:clean_folders
PAUSE
Nothing worked for me. I needed to delete all files in bin and obj folders for debug and release. My solution:
1.Right click project, unload, right click again edit, go to bottom
2.Insert
<Target Name="DeleteBinObjFolders" BeforeTargets="Clean">
<RemoveDir Directories="..\..\Publish" />
<RemoveDir Directories=".\bin" />
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
3. Save, reload project, right click clean and presto.
A very quick and painless way is to use the rimraf npm utility, install it globally first:
> npm i rimraf -g
And then the command from your project root is quite simple (which can be saved to a script file):
projectRoot> rimraf **/bin **/obj
To optimize the desired effect you can leverage the project event targets (the one you could use is BeforeRebuild and make it run the previous command) which are specified in the docs: https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017
I like the rimraf utility as it is crossplat and really quick. But, you can also use the RemoveDir command in the .csproj if you decide to go with the target event option. The RemoveDir approach was well explained in another answer here by #Shaman: https://stackoverflow.com/a/22306653/1534753
NB: This is an old answer and may need a tweak for newer versions as of VS 2019 and some obj artifacts. Before using this approach, please make sure VS doesn't need anything in your target and output directory to build successfully.
Something like that should do it in a pretty elegant way, after clean target:
<Target Name="RemoveObjAndBin" AfterTargets="Clean">
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<RemoveDir Directories="$(TargetDir)" />
</Target>
To delete bin and obj before build add to project file:
<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
Here is article: How to remove bin and/or obj folder before the build or deploy
Very similar to Steve's PowerShell scripts. I just added TestResults and packages to it as it is needed for most of the projects.
Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
This is my batch file that I use for deleting all BIN and OBJ folders recursively.
Create an empty file and name it DeleteBinObjFolders.bat
Copy-paste code the below code into the DeleteBinObjFolders.bat
Move the DeleteBinObjFolders.bat file in the same folder with your solution (*.sln) file.
#echo off
#echo Deleting all BIN and OBJ folders...
for /d /r . %%d in (bin,obj) do #if exist "%%d" rd /s/q "%%d"
#echo BIN and OBJ folders successfully deleted :) Close the window.
pause > nul
I use a slight modification of Robert H which skips errors and prints the delete files. I usally also clear the .vs, _resharper and package folders:
Get-ChildItem -include bin,obj,packages,'_ReSharper.Caches','.vs' -Force -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -ErrorAction SilentlyContinue -Verbose}
Also worth to note is the git command which clears all changes inclusive ignored files and directories:
git clean -dfx
Several solutions above give answers how to exclude folders, but not in cmd. Expanding on Steve Willcock's answer, to exclude e.g. the node_modules folder, that may have bin folders in it, one can use the expanded one-liner below.
FOR /F "tokens=*" %G IN ('DIR /B /AD /S bin obj ^|find ^"node_modules^" /v /i') DO RMDIR /S /Q "%G"
As noted by others, in the case of putting the above command in a cmd script and not using it directly in the command line, substitute %G with %%G.
In VS 2019/VS 2022 this is the only sane solution.
In the solution folder (where the .sln file is located), create a file called Directory.Build.props and add edit it as shown below. Read about this special file here.
Directory.Build.props
<Project>
<Target Name="RemoveObjAndBinFolders" AfterTargets="Clean">
<PropertyGroup>
<ObjFolder>$(ProjectDir)$(BaseIntermediateOutputPath)</ObjFolder>
<BinFolder>$(ProjectDir)$(BaseOutputPath)</BinFolder>
<!-- Microsoft.NET.Sdk.Web sets $(BaseIntermediateOutputPath) to -->
<!-- an absolute path. Not fixed up to MsBuild 17! -->
<BaseIntermediateOutputPathFix Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$([MSBuild]::MakeRelative(
$(ProjectDir),
$(BaseIntermediateOutputPath)
))</BaseIntermediateOutputPathFix>
<ObjFolder Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$(ProjectDir)$(BaseIntermediateOutputPathFix)</ObjFolder>
</PropertyGroup>
<ItemGroup>
<ObjFiles Include="$(ObjFolder)/*.*"
Exclude="$(ObjFolder)/project.assets.json" />
<ObjSubFolders
Include="$([System.IO.Directory]::GetDirectories('$(ObjFolder)'))" />
</ItemGroup>
<!-- Remove "obj" sub folders -->
<RemoveDir Directories="#(ObjSubFolders)" ContinueOnError="true" />
<!-- Remove "obj" files (keeping necessary asset file)-->
<Delete Files="#(ObjFiles)" />
<!-- Remove "bin" folders -->
<RemoveDir Directories="$(BinFolder)" ContinueOnError="true" />
</Target>
</Project>
No need to modify a bunch of .csproj files. Also, note that I'm not removing $(TargetDir) as some have suggested. Doing so might cripple the build system if $(OutDir) has been set to some custom directory (a common thing to do).
Have a look at the CleanProject, it will delete bin folders, obj folders, TestResults folders and Resharper folders. The source code is also available.
from Using Windows PowerShell to remove obj, bin and ReSharper folders
very similar to Robert H answer with shorter syntax
run powershell
cd(change dir) to root of your project folder
paste and run below script
dir .\ -include bin,obj,resharper* -recurse | foreach($) { rd $_.fullname –Recurse –Force}
Here is the answer I gave to a similar question, Simple, easy, works pretty good and does not require anything else than what you already have with Visual Studio.
As others have responded already Clean will remove all artifacts that are generated by the build. But it will leave behind everything else.
If you have some customizations in your MSBuild project this could spell trouble and leave behind stuff you would think it should have deleted.
You can circumvent this problem with a simple change to your .*proj by adding this somewhere near the end :
<Target Name="SpicNSpan"
AfterTargets="Clean">
<RemoveDir Directories="$(OUTDIR)"/>
</Target>
Which will remove everything in your bin folder of the current platform/configuration.
Is 'clean' not good enough? Note that you can call msbuild with /t:clean from the command-line.
On our build server, we explicitly delete the bin and obj directories, via nant scripts.
Each project build script is responsible for it's output/temp directories. Works nicely that way. So when we change a project and add a new one, we base the script off a working script, and you notice the delete stage and take care of it.
If you doing it on you logic development machine, I'd stick to clean via Visual Studio as others have mentioned.
I actually hate obj files littering the source trees. I usually setup projects so that they output obj files outside source tree. For C# projects I usually use
<IntermediateOutputPath>..\..\obj\$(AssemblyName)\$(Configuration)\</IntermediateOutputPath>
For C++ projects
IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"
http://vsclean.codeplex.com/
Command line tool that finds Visual
Studio solutions and runs the Clean
command on them. This lets you clean
up the /bin/* directories of all those
old projects you have lying around on
your harddrive
You could actually take the PS suggestion a little further and create a vbs file in the project directory like this:
Option Explicit
Dim oShell, appCmd
Set oShell = CreateObject("WScript.Shell")
appCmd = "powershell -noexit Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -WhatIf }"
oShell.Run appCmd, 4, false
For safety, I have included -WhatIf parameter, so remove it if you are satisfied with the list on the first run.
We have a large .SLN files with many project files. I started the policy of having a "ViewLocal" directory where all non-sourcecontrolled files are located. Inside that directory is an 'Inter' and an 'Out' directory. For the intermediate files, and the output files, respectively.
This obviously makes it easy to just go to your 'viewlocal' directory and do a simple delete, to get rid of everything.
Before you spent time figuring out a way to work around this with scripts, you might think about setting up something similar.
I won't lie though, maintaining such a setup in a large organization has proved....interesting. Especially when you use technologies such as QT that like to process files and create non-sourcecontrolled source files. But that is a whole OTHER story!
Considering the PS1 file is present in the currentFolder (the folder within which you need to delete bin and obj folders)
$currentPath = $MyInvocation.MyCommand.Path
$currentFolder = Split-Path $currentPath
Get-ChildItem $currentFolder -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
For the solution in batch. I am using the following command:
FOR /D /R %%G in (obj,bin) DO #IF EXIST %%G IF %%~aG geq d RMDIR /S /Q "%%G"
The reason not using DIR /S /AD /B xxx
1. DIR /S /AD /B obj will return empty list (at least on my Windows10)
2. DIR /S /AD /B *obj will contain the result which is not expected (tobj folder)
This Works Fine For Me:
start for /d /r . %%d in (bin,obj, ClientBin,Generated_Code) do #if exist "%%d" rd /s /q "%%d"
I use .bat file with this commad to do that.
for /f %%F in ('dir /b /ad /s ^| findstr /iles "Bin"') do RMDIR /s /q "%%F"
for /f %%F in ('dir /b /ad /s ^| findstr /iles "Obj"') do RMDIR /s /q "%%F"
I took a different approach to this problem. Rather than write a script to hunt for all the "obj" and "bin" folders in various places, I direct the build process to group those folders in a single, convenient location.
Add a Directory.Build.props file to the solution folder like so:
<Project>
<PropertyGroup>
<BaseProjectArtifactPath>$(MSBuildThisFileDirectory).artifacts\$(MSBuildProjectName)</BaseProjectArtifactPath>
<BaseOutputPath>$(BaseProjectArtifactPath)\bin\</BaseOutputPath>
<BaseIntermediateOutputPath>$(BaseProjectArtifactPath)\obj\</BaseIntermediateOutputPath>
</PropertyGroup>
</Project>
Now, all of the "bin" & "obj" folders will be created in a separate .artifacts folder in the solution root, rather than the various project folders. Ready to start with a clean slate? Just delete the .artifacts folder and you're good to go.
I think you can right click to your solution/project and click "Clean" button.
As far as I remember it was working like that. I don't have my VS.NET with me now so can't test it.