Home Upgrade Search Memberlist Extras Hacker Tools Award Goals Help Wiki Contact

Shell 

Batch file to move certain files to another folder and creating link to original sour

Hi to all,
I would like to create a .bat file that moves certain files (based on their extension) from a folder (with subfolders) to another disk preserving original tree structure while creating a .lnk in the original location to the moved files.

For example the .bat would behave like this:

File extension: mkv
Source path: d:\movies
Destination path e:\movies

The batch scans folder and subfolders and moves all the .mkv files to the new path, while creating a .lnk in the original source folder for each file that has been moved.

I found some code that I adapted to my purpose:

@echo off
cls

setlocal enabledelayedexpansion

set SOURCE_DIR=K:\source
set DEST_DIR=K:\dest

set FILENAMES_TO_COPY=*.txt


for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (

echo source: %%F

set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
set FILE_NAME_EXT=%%~nxF

set FILE_DIR
set FILE_INTERMEDIATE_DIR
set FILE_NAME_EXT

xcopy /S /I /Y /V "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"

echo destination "%DEST_DIR%!FILE_INTERMEDIATE_DIR%FILE_NAME_EXT!"

pause

)
)

In this first attempt, I just copy the files, and it works.

I want to check the destination (which I'll use as parameter for mklink) but the last echo

echo destination "%DEST_DIR%!FILE_INTERMEDIATE_DIR%FILE_NAME_EXT!"

This one gives me
destination "K:\dest"

I also tried

echo destination "%DEST_DIR%!FILE_INTERMEDIATE_DIR!FILE_NAME_EXT!"
This one gives me
destination "K:\dest\FILE_NAME_EXT"

Not what I would like to have, ie the full destination path\filename.extension
I guess I'm just missing something trivial...

Any ideas would be highly appreciated.

Thank you very much,

Matt
Does this need to be a Batch Script?

I Can't imagine any reason to use Batch over Powershell.
If it can be made in Powershell, I can help you out. Let me know.


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Sep 28, 2018 08:26 AM)Lib Wrote:  Does this need to be a Batch Script?

I Can't imagine any reason to use Batch over Powershell.
If it can be made in Powershell, I can help you out. Let me know.

Hi!

I wanted to use batch script only because I knew it a (very) little and I don't know at all Powershell, but it's really ok for me, as long as I can create something that does what I need to! :)

Thank you!
Code
$SourcePath = "D:\movies"
$DestinationPath = "E:\movies"

$FilesToMove = Get-ChildItem $SourcePath -Filter "*.MKV"

Foreach ($FileToMove in $FilesToMove)
{

    Move-Item $FileToMove.FullName -Destination $DestinationPath


    $TargetFile = "$DestinationPath\" + $FileToMove.Name
    $WScriptShell = New-Object -ComObject WScript.Shell
    $Shortcut = $WScriptShell.CreateShortcut("$SourcePath\$FileToMove.lnk")
    $Shortcut.TargetPath = $TargetFile
    $Shortcut.Save()

}


Please give this a Try.
To run it, Search for Powershell ISE, Open it and at the top left, hit the "New Script" Button. Paste the Code in the Top White part of the Shell and Run the entire script using "F5" or the Green Play button at the top.

Let me know if it works or not.


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Sep 28, 2018 11:34 AM)Lib Wrote:  
Code
$SourcePath = "D:\movies"
$DestinationPath = "E:\movies"

$FilesToMove = Get-ChildItem $SourcePath -Filter "*.MKV"

Foreach ($FileToMove in $FilesToMove)
{

   Move-Item $FileToMove.FullName -Destination $DestinationPath


   $TargetFile = "$DestinationPath\" + $FileToMove.Name
   $WScriptShell = New-Object -ComObject WScript.Shell
   $Shortcut = $WScriptShell.CreateShortcut("$SourcePath\$FileToMove.lnk")
   $Shortcut.TargetPath = $TargetFile
   $Shortcut.Save()

}


Please give this a Try.
To run it, Search for Powershell ISE, Open it and at the top left, hit the "New Script" Button. Paste the Code in the Top White part of the Shell and Run the entire script using "F5" or the Green Play button at the top.

Let me know if it works or not.

Thank you very very much!!!!!!!!

That's super great!!!!

I edited it a bit, to try it on small folders and with .txt files:

Code:
$SourcePath = "K:\source"
$DestinationPath = "k:\source2"

$FilesToMove = Get-ChildItem $SourcePath -Filter "*.txt"

Foreach ($FileToMove in $FilesToMove)
{

Move-Item $FileToMove.FullName -Destination $DestinationPath


$TargetFile = "$DestinationPath\" + $FileToMove.Name
$WScriptShell = New-Object -ComObject WScript.Shell
$Shortcut = $WScriptShell.CreateShortcut("$SourcePath\$FileToMove.lnk")
$Shortcut.TargetPath = $TargetFile
$Shortcut.Save()

}


I used Powershell ISE (the prompt says v1.0) on my Windows 10 64bit but I get this error:

Code: : The term 'Code:' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Code:
+ ~
+ CategoryInfo : ObjectNotFound: (Code::String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


I've seen that Powershell has been updated to v6.1 so I downloaded it and run it.
It created a new folder under Programs files, but I just found pwsh.exe and it's a prompt command. Is there a Powershell ISE v6.1 somewhere?

Thank you again for your help, you've opened up a new world to me!

Matt
Looks like you've got it to run perfectly, the "Code:" Portion was added by formatting on Hack forums, Just remove that and the script should run fine.


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Sep 28, 2018 11:56 AM)Lib Wrote:  Looks like you've got it to run perfectly, the "Code:" Portion was added by formatting on Hack forums, Just remove that and the script should run fine.

Hi!

I removed "Code:", typed set-executionpolicy unrestricted and the script run, but not as expected.
I run it on a temp folder with some text files.
The script didn't copy the source structure (it just created the destination folder with just on txt file) and strangely it also corrupted the fist "info.txt" file in the source folder (it was a 0-byte empty file):

L        À      F‹       …?g¾WÔ…?g¾WÔ…?g¾WÔY                     ß  PàOÐ ê:i¢Ø +00 /K:\                   V 1     =MM4 source2 @  ï¾=M94=MM4.   øZ                  Õ!Þ s o u r c e 2    Z 2 Y  =M@4  info.txt  B  ï¾=M@4=M@4.   [                  {v´ i n f o . t x t      F            1       E         ÇÈ^ì   DATA K:\source2\info.txt   . . \ s o u r c e 2 \ i n f o . t x t `      X       desktop-kp2oqgm Œ-
h°ËA¦p²ÚÊ…öÌÔä–¯Ãè´FØËŠ| &Œ-
h°ËA¦p²ÚÊ…öÌÔä–¯Ãè´FØËŠ| &E     9   1SPS±mD­pH§H@.¤=xŒ   h    H   ¿l3Ü        


This is the content of the only copied file:
L  À F‰  ß  PàOÐ ê:i¢Ø +00 /K:\ V 1  source2 @  ï¾ . s o u r c e 2  Z 2 info.txt B  ï¾ . i n f o . t x t   . . \ s o u r c e 2 \ i n f o . t x t



I would like to attach a zip file with the source folder, but I don't know how to attach it.

Thanks again, really!

Matt
(Sep 28, 2018 11:51 PM)DOSuser2018 Wrote:  Hi!

I removed "Code:", typed set-executionpolicy unrestricted and the script run, but not as expected.
I run it on a temp folder with some text files.
The script didn't copy the source structure (it just created the destination folder with just on txt file) and strangely it also corrupted the fist "info.txt" file in the source folder (it was a 0-byte empty file)

I would like to attach a zip file with the source folder, but I don't know how to attach it.

Thanks again, really!

Matt

Could you please send me a few Screenshots of what you mean.

Currently, The script will look in The folder called 'Movies' for Files only, There's no Recursiveness, If there are sub Folders inside 'Movies' you'd like to keep, Let me know.
Ideally, Please PM me a screenshot of your file structure if this is the case.

I'm not quite sure what you mean with attatching a Zip file? The script is exclusively looking for any file that ends in .mkv.


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Sep 29, 2018 06:19 AM)Lib Wrote:  Could you please send me a few Screenshots of what you mean.

Currently, The script will look in The folder called 'Movies' for Files only, There's no Recursiveness, If there are sub Folders inside 'Movies' you'd like to keep, Let me know.
Ideally, Please PM me a screenshot of your file structure if this is the case.

I'm not quite sure what you mean with attatching a Zip file? The script is exclusively looking for any file that ends in .mkv.

Hi, and thank you again for your time, I really appreciate that!!!!

The script I need must use recursiveness for all the subfolders and just move certain files, for now and for the sake of testing, .txt files.
Other files than .txt files must not be touched.

By attaching a zip file (just 2 kb actually) I mean I would like to send you the source folder I'm testing your script on, so that you can have my same results.
I can't send a PM because first I need 25 quality posts to send a PM.

When I post a message, like this reply to you, I don't see the option to send the forum some files, am I missing something?
I would like to send the zip file and some screen shots.

Thanks again,
Matt
(Sep 29, 2018 09:47 AM)DOSuser2018 Wrote:  Hi, and thank you again for your time, I really appreciate that!!!!

The script I need must use recursiveness for all the subfolders and just move certain files, for now and for the sake of testing, .txt files.
Other files than .txt files must not be touched.

Thanks again,
Matt

It's all good man, I'm enjoying it ;)
Just send me a PM with an uploaded screenshot using imgur or something.

Recursiveness is super easy in powershell, just finding it hard to Visualize what your File system is like :)


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Sep 29, 2018 01:01 PM)Lib Wrote:  It's all good man, I'm enjoying it ;)
Just send me a PM with an uploaded screenshot using imgur or something.

Recursiveness is super easy in powershell, just finding it hard to Visualize what your File system is like :)

Hi!
I uploaded these images here

h t t p s://i m g u r .com/a/MWrk3Ps

It's just a simple folder with subfolders, randomly created just for testing.
The folder has some .txt files and a .doc file.
I just want to move the .txt files to another folder on another disk, creating just the folders which actually contain .txt files, creating a link in the original source folder to the new moved file.
If the original folder has a subfolder that doesn't contain any .txt files, a sulfolder with this name doesn't have to be copied to the destination folder.


This is the folder structure I'm using for testing:

K:\source
          info1.txt

           source-a (subfolder)
                         info.txt
                          source-a1.txt

                          source-b (subfolder)
                                     dontmove.doc     <------ note this
                                     info.txt
                                     source-a1.txt
                         

After the script has run, I need to have:

e:\destination
                info1.txt

                  source-a (subfolder)
                         info.txt
                          source-a1.txt

                          source-b (subfolder)
                                     info.txt
                                     source-a1.txt

K:\source
          info1.LINK TO FILE IN E:\DESTINATION

           source-a (subfolder)
                         info.LINK TO FILE IN E:\DESTINATION
                          source-a1.LINK TO FILE IN E:\DESTINATION

                          source-b (subfolder)
                                     dontmove.doc
                                     info.LINK TO FILE IN E:\DESTINATION
                                     source-a1.LINK TO FILE IN E:\DESTINATION


I hope it's clearer now. :)

Thank you!


Hi!
I uploaded these images here

h t t p s://i m g u r .com/a/MWrk3Ps

It's just a simple folder with subfolders, randomly created just for testing.
The folder has some .txt files and a .doc file.
I just want to move the .txt files to another folder on another disk, creating just the folders which actually contain .txt files, creating a link in the original source folder to the new moved file.
If the original folder has a subfolder that doesn't contain any .txt files, a sulfolder with this name doesn't have to be copied to the destination folder.


This is the folder structure I'm using for testing:

K:\source
info1.txt

source-a (subfolder)
info.txt
source-a1.txt

source-b (subfolder)
dontmove.doc <------ note this
info.txt
source-a1.txt


After the script has run, I need to have:

e:\destination
info1.txt

source-a (subfolder)
info.txt
source-a1.txt

source-b (subfolder)
info.txt
source-a1.txt

K:\source
info1.LINK TO FILE IN E:\DESTINATION

source-a (subfolder)
info.LINK TO FILE IN E:\DESTINATION
source-a1.LINK TO FILE IN E:\DESTINATION

source-b (subfolder)
dontmove.doc
info.LINK TO FILE IN E:\DESTINATION
source-a1.LINK TO FILE IN E:\DESTINATION


I hope it's clearer now. :)

Thank you!
I promise, I haven't forgotten about this.

Just been working late, I'm going to try to figure this out.
It's exciting! This is harder than I thought :)


 [Image: HgiVJThObgU3akAroE9Hrg.png]
(Oct 4, 2018 06:27 AM)Lib Wrote:  I promise, I haven't forgotten about this.

Just been working late, I'm going to try to figure this out.
It's exciting! This is harder than I thought :)

I think so as well! :)


Hi,
just got your PM.

I read the script it's not finished, so I'm going to wait!
Thank you for now!!!
(Oct 4, 2018 06:27 AM)Lib Wrote:  I promise, I haven't forgotten about this.

Just been working late, I'm going to try to figure this out.
It's exciting! This is harder than I thought :)

have you got the source? id like to check out ps as ive always been loyal to batch


Possibly Related Threads...
Thread / Author Replies Views Last Post
[Shell] by Robert RougeSep 24, 2026 10:02 AM 4 219 Sep 24, 2026 10:02 AM
Last Post: Anonynuk
[C] by indetectableJan 23, 2022 01:30 PM 7 227 Jan 23, 2022 01:30 PM
Last Post: Lookdadon
[Shell] by fisica638Oct 30, 2019 11:05 AM 1 536 Oct 30, 2019 11:05 AM
Last Post: Hackoo