I used to program batch files for work but I quit since a long time, now I'm back on the job and there seemed to be a bit of a problem.
I try to edit txt files using CMD commands on a batch file:
e.g. echo hello >> *.txt
the thing is I want to add the text to all the txt files in that directory and I remember the * represented all the files in that directory with the same extension unless it's used as *.* then it includes all the files, but now all it does is just writes this error on cmd:
The filename, directory name, or volume label syntax is incorrect.
Can anyone can give a little help?
You can use a FOR /F loop with a DIR command to iterate the full paths and pass those over to the redirection append >> to echo to the text files accordingly.
Example FOR Loop
Be sure to change the value of the Folder= variable to be the directory you need to append to the files with the ECHO command.
Confirmed working batch script example
#ECHO ON
SET Folder=C:\MyFolder
CD /D "%Folder%"
FOR /F "TOKENS=*" %%A IN ('DIR /B /A-D "%Folder%\*.txt"') DO ECHO HELLO>>%%~fA
PAUSE
EXIT
Further Resources
DIR
FOR /F
In addition, substitution of FOR variable references has been
enhanced. You can now use the following optional syntax:
%~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
Related
When using this code to upload video's to YouTube, the title that gets named has the file extension at the end (in this case .mp4)
for %%f in (*.mp4) do python --file="%%f" --title="%%f"
use for %%f in (*.csv) do echo "%%~nf"
for more info do a for /? .. this is the part that you would liek to see
In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:
%~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
I want to process a folder and files in sub folders and after processing want to move files to new location (folder).
Current command is working but it is not creating sub folders and generating all new files in same folder (i.e. output folder)
for /F %%i in (filelist.txt) do (process.exe %%i > output\%%~nxi)
I need it to save it in same folder structure, as its source folder.
Where filelist.txt (source folder) is:
c:\backup\oldwork\browse.asp
c:\backup\oldwork\capital.asp
c:\backup\oldwork\make.asp
c:\backup\oldwork\conf\config.asp
c:\backup\oldwork\conf\global.asp
and I want my script to generate output (destination folder) like:
c:\backup\output\browse.asp
c:\backup\output\capital.asp
c:\backup\output\make.asp
c:\backup\output\conf\config.asp
c:\backup\output\conf\global.asp
Currently above For /F command is generating output like:
c:\backup\output\browse.asp
c:\backup\output\capital.asp
c:\backup\output\make.asp
**c:\backup\output\config.asp** (not following directory structure)
**c:\backup\output\global.asp**
The reason your code doesn't work is to do with what your outputting:
output\%%~nxi
Where if you check your documentation you would see:
You can now use the following optional syntax:
%~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:
%~nxI - expands %I to a file name and extension only
Since you are only expanding to name and extension, the folder structure is ignored.
Solution:
What I would do in your situation is this, change your filelist.txt to this format:
browse.asp
capital.asp
make.asp
conf\config.asp
conf\global.asp
And then change your for-loop as such:
for /F %%i in (filelist.txt) do (process.exe c:\backup\oldwork\%%i > output\%%i)
Which should work out for you.
for /F %%i in (filelist.txt) do (md "output%%~pi"&process.exe %%i > "output%%~pnxi")
should do the task, creating output\backup\oldwork\browse.asp etc. (for lack of adequate description of required result)
for %%a in (.\*.jpg) do
The code above will store every jpg picture's name in %%a, but it stores the full name with the file extension, for example "Q.jpg".
I'm using a cmd utility for resizing images,
resize /width:100 %%a %%a.jpg
It will resize "Q.jpg" and then name it to "Q.jpg.jpg", as you can see the extension is now a part of file name!!!
I want to avoid it.
Simple, type for /? for more info:
To only get filename:
for %%a in (.\*.jpg) do resize /width:100 %%a %%~na.jpg
Quoting Windows batch help (type for /?):
%~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
And that should help you with any further problems.
I have a batch file which is in a directory and must be run from there as well because it updates files within this directory.
This works perfectly fine, except when the user runs the batch file as administrator (required on Vista). Then the starting directory is C:\Windows\System32.
Is there any way to still be able to know from which directory the batch file was run?
I dont want the user to enter the directory manually.
Try to access the batch files path like this:
echo %~dp0
For more information see the following quote from the command for /? that describes how the above command works:
You can now use the following optional syntax:
%~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
Better than cd is pushd which will
change drive letter if starting from D:\...
assign a drive letter if on a UNC network path
So pushd %~dp0 is good.
Good practice is then to call popd when done.
This should solve your problem by setting the working directory for the batch file back to the current directory:
Include these two lines at the top of your .bat script:
#setlocal enableextensions
#cd /d "%~dp0"
Found at: http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur
To fix this problem, include these two lines at the top of your .bat script:
#setlocal enableextensions
#cd /d "%~dp0"
I use:
cd %0..
at the beginning of the batch file to change directory to the directory where the batch file was started in.
-Mathew
#setlocal enableextensions
#cd /d "%~dp0"
You can CD directly from the file name by adding the parent (not tested in windows 8.x, but has worked "forever" as far as I can remember).
CD %FILENAME%\..
and CD will change drives as well using /D, which is shown above but not explicitly mentioned so might be missed.
CD /D %FILENAME%\..
(FOR /?
IF /?
SET /?
CALL /?
GOTO /?
all provide highly useful reading if you use cmd.exe, I reread them once in a while.)
A working solution here:
http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html
FOR /F %%I IN ("%0") DO SET BATDIR=%%~dpI
ECHO The batch file is located in directory %BATDIR%
I have the following command which will loop over all the subdirectories in a specific location and output the full path:
for /d %i in ("E:\Test\*") do echo %i
Will give me:
E:\Test\One
E:\Test\Two
But how do I get both the full path, and just the directory name, so the do command might be something like:
echo %i - %j
And the output might be something like:
E:\Test\One - One
E:\Test\Two - Two
Thanks in advance!
The following command syntax can be used to return the full path or directory name only:
%~fI - expands %I to a fully qualified path name
%~nI - expands %I to a file name only
Using your example, the following command will list directories in the format that you specified:
for /d %i in ("E:\Test*") do echo %~fi - %~ni
You can use "%~ni". This is an enhanced substitution that will return the file name of a path (or, more accurately, the last part, which is the directory name in your case):
for /d %i in ("E:\Test\*") do echo %i - %~ni
See also this question: What does %~d0 mean in a Windows batch file?