Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 757
  • Last Modified:

ms-dos variable @path doesn't include & symbol of path - workarounds?

On any folders that have an & character in the folder name, the above (or below?) command seems to stop reading the name at that symbol.  For example, I have a folder called "A & A businees, inc."  When I run the forfiles command, the resultant command only shows "md c:\test\A " instead of md "c:\test\"A & A businees, inc."\TY08\Tax Returns"
It drops the & symbol and the rest of the name.  Ideas on how to overcome this?  I included the slashes so that I could get it to make folders with a space in the name - however, I'm not getting any folders with & in the name now.

Here's the catch:  If I run the second command included, the resultant command has the path correct (but isn't creating the directory as I wanted with a space.  I had to include the underscore.
1. forfiles /p c:\test /c "cmd /c if @isdir==TRUE md \"@path\TY08\Tax Returns\""
 
2. forfiles /p p:\ /c "cmd /c if @isdir==TRUE echo md @path\TY08\Tax_returns" > c:\fileorig.txt

Open in new window

0
bruderbell
Asked:
bruderbell
2 Solutions
 
Shift-3Commented:
This may work better using the FOR command instead of FORFILES.

Paste the script below into a text file with a .cmd extension.  Running it will create the subfolders.

If you are going to run this from the command prompt rather than from a batch script, replace each instance of %%G with %G.


@echo off
setlocal
 
set folder=c:\test
 
for /F "tokens=*" %%G in ('dir "%folder%" /A:D /B') do md "%folder%\%%G\TY\Tax Returns"

Open in new window

0
 
Lee W, MVPTechnology and Business Process AdvisorCommented:
If shift-3's comment doesn't work, it may be because & is used to join two commands on one command line.  For example:
C:\Temp\scripts>@echo firstline & @echo secondline
firstline
secondline

if you were not putting the & in a variable, you could probably escape it using ^ - for example,
C:\Temp\scripts>@echo firstline ^& @echo secondline
firstline & @echo secondline

Given this behavior and the possibility for problems, I would suggest your best solution is to search and replace every ampersand with the word "and"

For example, instead of using 'dir "%folder%" /A:D /B', make it two separate commands and do some editing:
Command 1:
dir "%folder%" /A:D /B>folderlist.txt

Then using notepad, do a quick search and replace, then run an if command similar to the one suggested above:
for /F "tokens=*" %%G in (folderlist.txt) do md "%folder%\%%G\TY\Tax Returns"

0
 
Lee W, MVPTechnology and Business Process AdvisorCommented:
You can probably also get around this using the for command alone:

@echo off
setlocal
 
set folder=c:\test
 
for /F "tokens=1* delims=&" %%G in ('dir "%folder%" /A:D /B') do (
   If "%%H"=="" (
      md "%folder%\%%G\TY\Tax Returns"
   ) Else (
      md "%folder%\%%G ^& %%H\TY\Tax Returns"
      REM The next line replaces the & with the word and in the folder name but is commented out at the moment.
      REM md "%folder%\%%G and %%H\TY\Tax Returns"
   )
)
0
Veeam and MySQL: How to Perform Backup & Recovery

MySQL and the MariaDB variant are among the most used databases in Linux environments, and many critical applications support their data on them. Watch this recorded webinar to find out how Veeam Backup & Replication allows you to get consistent backups of MySQL databases.

 
Lee W, MVPTechnology and Business Process AdvisorCommented:
And as I think about it and re-read the question, you cannot replace the & without renaming existing folders... so scratch that.  There's another way you can probably get around this:



@echo off
setlocal
 
set folder=c:\test
 
Rem create sub folders for all clients with ampersands in their folder names
for /F "tokens=1* delims=&" %%G in ('dir "%folder%" /A:D /B ^| Find /i "&"') do md "%folder%\%%G ^& %%H\TY\Tax Returns"
 
Rem create sub folders for all clients without ampersands in their folder names
for /f "tokens=*" %%G in ('dir %folder% /ad /b ^| Find /i /v "&"') do md "%folder%\%%G\TY\Tax Returns"

Open in new window

0
 
Shift-3Commented:
Is there some problem with my method?
0
 
AmazingTechCommented:
Here give this a go.

If you're running it from the command line then use this:
forfiles /p c:\test /c "cmd /c if @isdir==TRUE for %a in (@path) do md \"%~a\TY08\Tax Returns\""

forfiles /p c:\test /c "cmd /c if @isdir==TRUE for %%a in (@path) do md \"%%~a\TY08\Tax Returns\""

Open in new window

0
 
bruderbellAuthor Commented:
Both of your solutions fix the problem, apparently through the use of different variables than those that are available simply in the /c cmd format.  Thanks!
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now