Get a filename with a specific extension from a directory - command-line

I want to Get a filename with a specific extension from a directory. Then in a result, I want to get rid of the extension name.
enter code here
#echo off
for %%f in (*.pdf) do (
if "%%~xf"==".pdf" echo %%f
)
Let say in the directory the pdf files are (one.pdf, two.pdf, and three.pdf)
In the command above the results are
one.pdf
two.pdf
three.pdf
my preferred results are:
one
two
three
Thanks in Advance
Ryl

You can use the cut command to remove the '.pdf'.
For example, this will print out 'one':
echo 'one.pdf' | cut -d'.' -f 1

Related

How to take output of dir search and modify specified file

I'm trying to use this script to assist technicians with renaming files that are found on an end users computer within their %appdata% folder. The script works up until this point, but I can't figure out how to take the output of the DIR search to use it as the current directory so I can modify the destination folder.
Basically, I need to make changes to this folder:
C:\users\bob\appdata\local\apps\2.0\'7'\'7'\time...exe_bfe88f94fc69adaa_0005.0011_none_b883acbb6e8d0075
The two 7's or wildcards are always different folder directory names, so that's why I can't use a static path to make changes to these folders. Anyways, here is the script so far, it works just fine in locating the folder I need, but I cannot seem to use the output to specify it as the target so I can make changes to it. Thank you for your help.
cd %appdata%
cd ..
cd local\apps\2.0
dir "time...exe_bfe88f94fc69adaa_0005.0011_none_39f58db4ac6311ec" /ad /s
I've tried using the pipeline argument (|) and the '&' and then using a rename command or a removedir, but it cannot find the file specified.
Thank you for your help!
Here's a batch-file which is a little more direct than just recursing the entire tree. It only steps over the two 'unknown' directory names, (%%~nxG\%%~nxH), and checks there for the named directory, (which you should edit as needed on line 3):
#Echo Off & SetLocal EnableExtensions
Set "DirName=time...exe_bfe88f94fc69adaa_0005.0011_none_39f58db4ac6311ec"
Set "BaseDir=%LocalAppData%\apps\2.0"
Set "AppPath="
For /D %%G In ("%BaseDir%\*")Do For /D %%H In ("%%G\*")Do For %%I In (
"%%H\%DirName%")Do If "%%~aI" GEq "d" Set "AppPath=%%~I"
If Not Defined AppPath Echo %DirName% Not Found & Pause & Exit /B 1
Echo %%AppPath%% = %AppPath% & Pause
Nothing else should be modified except for the last line which I added just to provide some output, (you/your technicians would use "%AppPath%" to reference the target directory from that point forward).
If you were looking for something in powershell, then perhaps this will push you in the right direction:
$DirName = "time...exe_bfe88f94fc69adaa_0005.0011_none_39f58db4ac6311ec"
$AppPath = (RvPa "$Env:LocalAppData\apps\2.0\*\*\$DirName").Path
$AppPath
Once again the last line is just to provide output and show you the variable you'll need to reference your target directory, and the first line will need editing as needed.
This code uses a FOR loop to find directory names that match. There is an ECHO inside the loop since I do not know if multiple directories could be found.
#ECHO OFF
CD "%APPDATA%\.."
FOR /F "delims=" %%A IN ('DIR /S /B /A:D "time...exe_bfe88f94fc69adaa_0005.0011_none_39f58db4ac6311ec"') DO (
ECHO Found directory "%%~A"
SET THEDIR=%%~A
)
DIR "%THEDIR%"
REN "%THEDIR%\file1.txt" "file2.txt"

Strip image metadata and rename it using a text file as source of input

I am ok with PowerShell or cmd-based suggestions. This is what I am trying to do:
I have this folder structure:
C:\Parent\Child01\ - Lots of JPG images
C:\Parent\Child02\ - Lots of JPG images
C:\Parent\Child03\ - Lots of JPG images
so on and so forth.
What I am doing currently manually:
I will be inside the Child 01 folder and run this command to strip meta data from all images
exif -r -all= -ext jpg -ext gif -ext png
I have a txt file with keywords one per line. I want the images inside my current directory (Child01) to be replace with the names I gave in the text file.
How I am doing this right now is by using an excel sheet with 3 columns :
Original File Name | New File Name | Rename Command
Original File Name has the content of all files names (I get this by running dir /b /a-d)
New File Name has my keywords
The Rename Command is a formula =concatenate("ren ",A2,".jpg ",B2, ".jpg")
This helps me generate the formula which I copy paste from command line to bulk rename.
Can some help me with a batch file or powershell script so I can get it all done in one go, please?
No need to bother Excel. It renames each .JPG to the next name of the file (it should just contain one column ("NewFileName" (without extension)). If it runs out of either files or lines, it stops.
#echo off
setlocal enabledelayedexpansion
<file.txt (
for /f "delims=:" %%a in ('dir /b *.jpg') do (
set "x="
set /p x=
if not defined x goto :eof
ECHO ren "%%a" "!x!%%~xa"
)
)
Check the output before you remove the ECHO command to actually enable the ren command.

how to rename files using command line

I want to rename 2 files "Data1.txt" to "Log1.rtf" and "Data2.txt" to "Log2.rtf"
I am currently using this code
#ECHO OFF
FOR %%I IN ("%~dp0*.txt") DO (
SET "ext=%%~xI"
SETLOCAL EnableDelayedExpansion
RENAME "%%I" "%%~nI!Log.rtf"
ENDLOCAL
)
But it give output "data1log.rtf" and "data2log.rtf"
of course:
RENAME "%%I" "%%~nI!Log.rtf"
But it give output data1log.rtf and data2log.rtf
btw. what do you try to achive with setlocal delayedexpansion and that single ! ?
EDIT: if you insist in doing it with for (because perhaps, you have many files to rename):
#echo off
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
set file=%%i
set file=!file:Data=Log!
set file=!file:.txt=.rtf!
echo ren %%i !file!
)
the first set sets the variable file to the filename
the second one replaces Data with Log
the third one replaces .txt with .rtf
then rename original filename (%%i) to the changed filename (!file!)
(the echo is there to just show the command on screen instead of really renaming files. Good for testing. If you are sure, that the code does, what you want, just remove the echo)
the setlocal enabledelayedexpansion is needed to use a variable, that is changed inside a block (between ( and )) inside the same block. Therefore you have to use the variable as !var! instead of %var%
Note: of course this code could be improved, but as a beginner: keep it as simple (and readable) as possible. For example, this code will replace Data, but not data or DATA, it will not handle spaces in filenames, ...
It might work better if you used separate code to rename each of the files, or does that defeat the object?
this website shows how to rename a file using command line:
http://www.sevenforums.com/tutorials/56013-file-folder-rename-command-prompt.html
for %%a in ("%~dp0data*.txt"
) do for /f "delims=DdAaTt" %%b in ("%%~na"
) do echo ren "%%~fa" "log%%b.rtf"
It just iterates over the indicated list of files, and for each filename, uses the unnecesary characters as delimiters for an aditional for loop. That way only the number is left and used to rename the file.
Commands to rename are echoed to console. If output is correct, remove the echo command to rename the files.
User mv command to rename files in windows (Using CLI)
As mentioned in above answer, mv command can be used in windows as well to rename the filename. I tried rename and ren commands s suggested, but I was getting error: bash: ren: command not found.
Use below to change the filename:
mv filename new_filename

Rename Multiple Text file using Batch file

How would I write a batch file to rename multiple text files?
Suppose we have to rename 200 files as below
ABC_Suman_156smnhk.txt,
ABC_Suman_73564jsdlfm.txt,
ABC_Suman_9864yds7mjf45mj.txt
To
MNC_Ranj_156smnhk.txt,
MNC_Ranj_73564jsdlfm.txt,
MNC_Ranj_9864yds7mjf45mj.txt
Note: I need this ABC_Suman part only changed to MNC_Ranj
Any help would be appreciated.
To perform a batch rename, the basic command looks like this:
for filename in foo; do echo mv \"$filename\" \"${filename//foo/bar}\"; done > rename.txt
The command works as follows:
The for loop goes through all files with name foo in the current directory.
For each filename, it constructs and echoes a command of the form mv “filename” “newfilename”, where the filename and new file name are surrounded by double quotes (to account for spaces in the file name) and the new file name has all instances of foo replaced with bar. The substitution function ${filename//foo/bar} has two slashes (//) to replace every occurrence of foo with bar.
Finally, the entire output is saved to rename.txt for user review to ensure that the rename commands are being generated correctly.
i took it from the following link:
http://www.peteryu.ca/tutorials/shellscripting/batch_rename
#echo off
setlocal enableDelayedExpansion
for %%F in (ABC_Suman*.txt) do (
set "name=%%F"
ren "!name!" "!name:ABC_Suman=MNC_Ranj!"
)

Batch to run exe after checking directory for a file

I have a program that I need to run via command line that I want to make a batch file for to save time. It looks for any files in the same directory with a specific extension and then runs the exe to manipulate the file. Something like:
example.exe option1 *.ext
Where .ext is a file with the correct type of extension it's looking for. The file type usually has different filenames, but always the same extension. The option is just something the program knows how to use so that can be ignored for now.
Trick is I only want this to run IF there isn't already another file in the same directory with the same name but a different extension.
I think I saw something about being able to use IF statements in batch files, but I have no idea how this would be done. Any ideas?
You can iterate yourself over the files:
for %%x in (*.ext) do (
if exist %%~n.someotherext example.exe option1 "%%x"
)
echo off
REM search .txt files.
for %%f in (*.txt) do (
REM skip if a .log file with the same name exists.
if not exist %%~nf.log (
echo Now executing %%f
notepad.exe %%f
REM Terminate the loop after the first succesful file
goto end
) else (
echo Skipping %%f
)
)
echo Nothing to process.
:end
pause