match all files in current directory - command-line

How do I achieve this in Windows using either Command-prompt or PowerShell?
myprog *
EDIT: I want to call myprog with each file in the current directory as an argument.

If your goal is to call "myprog.exe" for each file in a directory, assuming that "myprog.exe" does not handle wildcards by itselef, it should be something like that in powershell :
dir | % {prog $_.FullName}
Edit : taking your comment into account, try this :
prog (get-childItem -name)
Hope it helps...

I wrapped Cédric Rup's solution in a function ea (ExpandAll?). Not as clean as the Unix approach though.
function ea ($p="*") { dir $p | foreach { '"{0}" ' -f $_.Name } }
.\Myprog.exe (ea)
.\Myprog.exe (ea *)
.\Myprog.exe (ea *.txt)

In a .CMD or .BAT file:
SETLOCAL EnableDelayedExpansion
FOR %%f in (*) DO SET params=!params! "%%f"
CALL myprog %params%
The SETLOCAL EnableDelayedExpansion and !variable! syntax allow you to accumulate the results. (See this page for explanation and examples.)
Edit: Added quotes around the %%f, and changed the listing to be '*'... see comments below.

Do you mean the following construct in command shell (cmd.exe):
for %f IN (*.*) DO echo %f

Related

Batch add basename to another file

I screwed up with mmv and deleted a few characters from the end of the filenames in a folder (before the extension).
Luckily I have other files with the same original basename but with a different extension.
I would like to know whether there is a way make a loop:
To match the remainder of the basename from the modified file to the second file with the original filename.
If it matches, rename the file with the original filename
Example:
Wrong filenames: foo-1234.txt
foo-1225.txt
Right files: foo-1234-5678.png
foo-1225-6789.png
Desired output:
foo-1234-5678.txt
foo-1225-6789.txt
Thank you very much in advance!
You didn't mention what environment we are talking about, but I'm assuming it's Windows cmd. You can try this:
#echo off
setlocal enabledelayedexpansion
for %%f in (foo-*.png) do set f=%%f & rename !f:~0,8!.txt !f:~0,13!.txt
It must be executed from batch file - delayed expansion won't work from direct command line.
EDIT
powershell counterpart:
dir foo-*.png | % { $stem = $_.name -replace 'foo-([^.]+).png','$1'; $bad = $stem.substring(0,4); mv foo-$bad.txt foo-$stem.txt; }
bash:
for file in foo-*.png; do stem=${file:4:9}; bad=${file:4:4}; mv foo-${bad}.txt foo-${stem}.txt; done

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"

Using for loop with wildcard cmd

Inside a batch file, I am trying to write a for loop to process files in a directory. I have tried doing this:
for %%file in (*.in) do echo %%file
It tells me: %file was unexpected at this time.
Can someone solve my problem?
Thanks
A loop variable cannot have more than 1 letter in its name, eg:
for %%f in (*.in) do echo %%f

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

Recursive file copy and rename on the Vista command line

I'm trying to recurse through my music directory and copy every file called folder.jpg to a file in the same directory called cover.jpg.
I've tried variations of suggestions in this question such as this:
for /r %i in (folder.jpg) do copy %i cover.jpg
Resulting in "The system cannot find the file specified."
How can I solve this problem?
Edit
Here's what I ended up going with:
for /r %i in (folder.jpg) do copy "%i" "%~picover.jpg"
Try this:
for /f "usebackq delims==" %I in (`dir /b /s ^| findstr folder.jpg`) do copy "%I" "%~pIcover.jpg"
Decoder Ring:
usebackq :: run the command in the backquotes and use the output as the input for the loop
delims== :: use the equal sign as a delimeter. Really you could use any character that isn't valid in a file name
dir /b /s :: do a recursive directory listing only outputting the bare file names
^| :: ^ escapes the pipe character, the pipe - well pipes the output from the first command to the second
findstr :: searches the input for matching lines, and only outputs them
%~pI :: the tilde p instructs the variable expansion to only output the path rather than full file name + path. Note, this includes a trailing \
I hope this helps!
You are missing double-quotes on the copy command.
The %i variable will be holding the full-path to the file -- which may contain spaces.
Try using:
for /r %i in (folder.jpg) do copy "%i" cover.jpg
You probably don't have any files in your music folder called folder.jpg so it fails right?
I tried this in mymusic folder with a dummy file called folder.jpg and it copied it normally. ;)
Edit:
Kishi is right, you are missing the double quotes on the second %i
PowerShell must replace CMD. It is inevitable and righteous. And it's my job to help it along...
gci -r . folder.jpg | % { copy $_.FullName ([IO.Path]::Combine( $_.Directory.FullName, "cover.jpg" )) }
You could just use xcopy with the /s flag...
EDIT:
My bad - didn't read the question properly. Xcopy with /s will help when just copying the files to a fixed destination.