I have created a batch-file which reads an ID from a CSV file and then searches for files with that ID contained within the title of log files created or modified within a specific date range to move them into a network folder.
At this moment, it seems the code is working (+-) but it is copying more files than it should, without looking at the ID.
It works on my local machine, so it seems the problem is regarding the network paths and it shows the UNC not supported path.
cd \\10.XX.ZZ.YY\ServersFiles
ECHO Will start reading the log files
for /f "usebackq tokens=4 delims=," %%a in ("\\10.XX.ZZ.YY\Folder1\Folder2\Execution_Logs\Tasks_Complete.csv") do (
for /r %%i in (*%%a*.log) do xcopy /Y /D:%date_arg% "%%i" "\\10.XX.ZZ.YY\Logs\"
)
This is what I'm getting right now
If UNC paths aren't allowed, you could try using PushD instead of CD, which will create a temporary drive mapping to the network location. Throughout the rest of your script you could then use relative paths to the required locations.
Example:
#Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
REM Your %date_arg% variable should be defined somewhere around here.
PushD \\10.XX.ZZ.YY\ServersFiles 2>NUL || Exit /B
If Not Exist "..\Folder1\Folder2\Execution_Logs\Tasks_Complete.csv" Exit /B
Echo Will start reading the log files
For /F "UseBackQ Tokens=4 Delims=," %%A In (
"..\Folder1\Folder2\Execution_Logs\Tasks_Complete.csv")Do For /R %%B In (
"*%%A*.log")Do XCopy "%%B" "..\Logs\" /D:%date_arg% /Y
PopD
EndLocal
Exit /B
Related
I have 30 folders, one for each travel group with 10 subfolders each, each subfolder corresponds to an activity.Some pictures dont match with the group, so i have a list of the pictures that dont match.
Im using this batch to move the jpgs from the folders but it's putting them all together. is there any way that the batch creates a folder with the name of the folder it's been moved from?
for /r "originfolder" %%# in (*) do findstr "%%~nx#" "filelist.txt"&&move "%%#" "destinyfolder"
PAUSE
You'll need a few more lines. There are a few different ways, this being one of them.
#echo off
setlocal enabledelayedexpansion
pushd "originfolder"
for /F "usebackq delims=" %%a in ("filelist.txt") do for /F "delims=" %%i in ('dir /b /s "%%a" 2^>nul') do (
set "filepath=%%~dpi"
set "filepath=!filepath:~0,-1!"
for %%f in (!filepath!) do set "destpath=%%~nxf"
mkdir "C:\Full path to\destinypath\!destpath!"
move "%%~a" "C:\Full path to\destinypath\!destpath!"
)
popd
simply get the path of the file, then use the last name of the path (folder where file exists) and create that folder name in your destination path, before moving the file.
Note, this is untested code, so please use a test scenario before attempting this in production.
Similiar problem as previously solved question here - Batch create folders based on part of file name and move files into that folder
QUESTION: I have 15k files that I want to extract the first word from file name to create a folder, then move all those respective files into the folder.
This is driving me crazy trying to figure out!!!
**EXAMPLE: **Using the files below, I want all files beginning with PTC to move into a new folder called PTC, then the same process with files beginning with PRIORITY.
PTC-Affiliate Digital Asset Refresh (160x600)
PTC-Affiliate Digital Asset Refresh (160x600)2
PTC-Affiliate Digital Asset Refresh (160x600)3
PRIORITY-Affiliate Digital Asset Refresh (160x600)
PRIORITY-Affiliate Digital Asset Refresh (160x600)2
PRIORITY-Affiliate Digital Asset Refresh (160x600)3
I tried revising existing code (below), but am running into 2 issues:
File names use spaces, not underscore - how do I denote that in the code?
When I rename a test file using underscores instead of spaces, the code below will create the folder, but not move the actual files.
CODE I AM TRYING TO EDIT TO DO WHAT I WANT:
#ECHO OFF
SETLOCAL
SET "sourcedir=C:\[directory\]"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4 delims=-" %%a IN ('dir /b /a-d "*\_*_\*_*\_*"') DO (
MD %%a 2\>nul
MOVE "%%a\_%%b\_%%c\_%%d\_%%e" .%%a\\ 2\>nul
)
POPD
GOTO :EOF
Any help or suggestions would be VERY welcomed.
Thank you!
I tried revising existing code (below), but am running into 2 issues:
File names use spaces, not underscore - how do I denote that in the code?
When I rename a test file using underscores instead of spaces, the code below will create the folder, but not move the actual files.
I am not able to solve for either of these issues.
Maybe your approach of focusing on old code is not allowing you to focus on the task at hand :)
You really only care about the first word, delimited by -. So split only that, then move all files starting with the first word once off:
#echo off
SET "sourcedir=C:\[directory\]"
pushd "%sourcedir%"
for /f "delims=-" %%i in ('dir /b /a-d "*-*"') do (
mkdir "%%~i">nul 2>&1
move %%i* "%%~i">nul 2>&1
)
popd
however, there is a chance (though you did not specify this) that there are other files that you might want to skip in the directory, then might do:
#echo off
set "sourcedir=C:\[directory\]"
pushd "%sourcedir%"
for %%a in ("*-*(*x*)*") do for /f "delims=-" %%i in ('dir /b /a-d "%%~a"') do mkdir "%%~i">nul 2>&1 && move "%%a" "%%~i"
popd
and if you feel like some regex and be more specific with your query, then findstr will help by enforcing wildcards, spaces and/or alphabetical or numeric character ranges as in the extract from below. findstr /R /C:"[a-z]-*[ ]*[ ]*[ ]*[ ]([[0-9]*[0-9]x[0-9]*[0-9])[0-9]*[0-9]$" :
#echo off
set "sourcedir=C:\[directory\]"
pushd "%sourcedir%"
for /f "tokens=1,*delims=-" %%a in ('dir /b /a-d ^| findstr /R /C:"[a-z]-*[ ]*[ ]*[ ]*[ ]([[0-9]*[0-9]x[0-9]*[0-9])[0-9]*[0-9]$"') do (
mkdir "%%~a">nul 2>&1
move "%%a-%%b" "%%~a"
)
popd
I am in the middle of batch extracting screenshots for contents we are planning to use on a tube site I am working on.
The jpeg files per content is labled as followed:
6c82c0239f6eb839-1
6c82c0239f6eb839-2
all the way to 120
The file name is different per content
a82384e2c46ba4af-1
a82384e2c46ba4af-2
etc.
They will all be extracted to a singe folder.
So I basically need a batch file that will create folders based on the content name without the dash and number and move all 120 jpegs in the folder with the content name.
For example:
Create folder named 6c82c0239f6eb839 and
move 6c82c0239f6eb839-1 to 6c82c0239f6eb839-120 in to the created folder.
I saw another thread with the following batch file. its pretty much what I want but the folder name is only 3 characters long and the files are copied to the newly created folders instead of moving them.
#echo off
SetLocal EnableDelayedExpansion
for /F "delims=" %%a in ('dir /b *.jpeg') do (
set Name=%%a
set Folder=!Name:~0,3!
xcopy /y "%%a" !Folder!\
)
Could someone change this so that it will display full file name without the dash and number for the folders and move files in its respective folders instead of copy?
Thank you
#echo off
setlocal
#rem Get each jpeg file.
for /F "delims=" %%A in ('2^>nul dir /b *.jpeg') do (
rem Get filename as token before the dash.
for /f "delims=-" %%B in ("%%~A") do (
rem Make dir if needed.
if not exist "%%~B" md "%%~B"
rem Check if isdir.
2>nul pushd "%%~B" && popd
if errorlevel 1 (
>&2 echo Failed isdir "%%~B".
) else (
rem Do the move operation.
>nul move /y "%%~A" "%%~B"
if errorlevel 1 (
>&2 echo Failed move "%%~A" to "%%~B"
)
)
)
)
exit /b %errorlevel%
The code is well remarked so if you want to understand
the evaluated code by changing #echo off to #echo on.
The use of %errorlevel% after the exit /b is not
required though will let you know what the errorlevel is
when #echo on is used.
The pushd tests for a directory
(even if it is a symlink).
errorlevel is checked to decide if to echo a
error message or do the move.
As the for loop variables are used direct, use of
enabledelayedexpansion is not needed.
Many commands support the argument of /? to get help
about the command. i.e. move /?.
If you only try to copy the correct jpeg to the correct folder, you can do this:
#echo off
SetLocal EnableDelayedExpansion
CD <CORRECT ROOT PATH>
for /F "delims=" %%a in ('dir /b *.jpeg') do (
set Name=%%a
REM I presume all the files have 16 characters before the dash
set Folder=!Name:~0,16!
IF NOT EXIST !Folder! MKDIR !FOLDER!
xcopy /y "%%a" !Folder!\
)
I was not able to test.
First of all, I would like to apologize for my manners regarding my initial post.
The answer by micheal_heath has resolved my issue.
Furthermore, I happened to find this post by user Salmon Trout from a different site which also worked.
Batch file to make folders with part of file name and then copy files
#echo off
setlocal enabledelayedexpansion
for %%A in (*.psd *.jpg) do (
echo file found %%A
for /f "delims=" %%B in ("%%A") do set fname=%%~nB
for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D
echo folder name !folname!
if not exist "!folname!" (
echo Folder !folname! does not exist, creating
md "!folname!"
) else (
echo Folder !folname! exists
)
echo Moving file %%A to folder !folname!
move "%%A" "!folname!"
)
echo Finished
pause
I just changed the the following line remove the hypen and numbers to create folders for the file name properly.
for /f "tokens=1* delims=-***" %%D in ("!fname!") do set folname=%%D
I still lack the knowledge on why and how both methods work, but this has been an interesting start for me. I hope other beginners trying to solve a similar issue can find something useful from this post.
I need a batch file to create a process for a list of files in a directory.
The filename structure is, for example: 00000_AAA_132144_2012021.txt
I need the batch to:
1 - Create a folder name based on the numbers after the second underscore, as this is the only constant in the naming.
2 - Move the file into the new folder.
In the example of the above the batch would create a folder called 132144 and then move the file 00000_AAA_132144_2012021.txt into the folder
For a similar requirement I used the script Endoro created for me (below). Is it possible to modify this to meet my requirement?
#echo off &setlocal
for /f "delims=" %%i in ('dir /b /a-d *.PDF') do (
set "filename1=%%~i"
setlocal enabledelayedexpansion
set "folder1=!filename1:~11,6!"
mkdir "!folder1!" 2>nul
move "!filename1!" "!folder1!"
endlocal
)
If you know that the filenames will be the same length, you can do the following to get the numbers after the second underscore -
set filename=00000_AAA_132144_2012021.txt
set dirname=%filename:~10,6%
If the spacing may vary - you can do the following -
for /f "delims=_ tokens=3" %%a in ('echo %filename%') do set dirname=%%a
And yes, the script written for you seems to do essentially the same thing as what you're asking - I've edited it to do what you've asked -
#echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir /b /a-d *.txt') do (
set "filename=%%~i"
for /f "delims=_ tokens=3" %%a in ('echo !filename!') do set folder=%%a
mkdir "!folder!" 2>nul
move "!filename!" "!folder!"
)
This will move all *.txt documents to a folder created based on the third section of the text files name. Note that this will cause problems if you have .txt documents in the directory that do not follow the same naming standard.
#ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET "destdir=c:\destdir"
FOR /f "delims=" %%a IN ('dir /b /a-d "%sourcedir%\*_*_*_*.txt" ') DO (
FOR /f "tokens=3delims=_" %%m IN ("%%a") DO (
ECHO MD "%destdir%\%%m"
ECHO MOVE "%sourcedir%\%%a" "%destdir%\%%m\"
)
)
GOTO :EOF
Endoro's routine selects .pdf files, you've specified .txt
Find filenames matching the mask, find the third _-separated token in the name, make that directory and then move the file.
The required commands are merely ECHOed for testing purposes. After you've verified that the commands are correct, change ECHO MD to MD to actually create the directories and change ECHO MOVE to MOVE to actually move the files.
Append 2>nul to suppress error messages (eg. when the directory already exists)
Append >nul to suppress report messages (eg. 1 file moved)
I want to check all the files in one folder to see if they exist in another folder. When a file is found in the first folder that doesn't exist in the second folder I want that file to be deleted.
Is this possible?
Edit path info as appropriate (or incorprate batch arguments %1 %2), and remove ECHO that precedes DEL once you confirm you are getting the correct results.
#echo off
setlocal
set "dir1=."
set "dir2=d1"
set tempFile="%temp%\exclude%random%.txt"
dir /b "%dir2%" >%tempFile%
for /f "eol=: delims=" %%F in ('dir /b /a-d "%dir1%" ^| findstr /vixg:%tempFile%') do echo del "%dir1%\%%F"
del %tempFile%
Note - This solution is simply comparing names. Two completely different files will be considered the same if they have the same name.