如何使用命令提示符或Power Shell为多个文件夹中的多个文件创build符号链接?

我有两个主文件夹在不同的驱动器中有很多的子文件夹。 必须为第一个文件夹中的所有文件创build符号链接。

C:\folderC>tree /f C:. ├───folder1 │ file1.txt │ file3.txt │ └───folder2 file1.txt file3.txt D:\folderD>tree /f D:. ├───folder1 │ file2.txt │ └───folder2 file2.txt 

结果使用2个命令:

 C:\>mklink C:\folderC\folder1\file2.txt D:\folderD\folder1\file2.txt symbolic link created for C:\folderC\folder1\file2.txt <<===>> D:\folderD\folder1\file2.txt C:\>mklink C:\folderC\folder2\file2.txt D:\folderD\folder2\file2.txt symbolic link created for C:\folderC\folder2\file2.txt <<===>> D:\folderD\folder2\file2.txt C:. ├───folder1 │ file1.txt │ file2.txt │ file3.txt │ └───folder2 file1.txt file2.txt file3.txt 

如何使用几个命令为所有文件,而不是为每个文件手动编写代码?

PS:首先,我想使用硬链接,但似乎是不可能的。

 C:\>mklink /h C:\folderC\folder2\file2.txt D:\folderD\folder2\file2.txt The system cannot move the file to a different disk drive. 

Solutions Collecting From Web of "如何使用命令提示符或Power Shell为多个文件夹中的多个文件创build符号链接?"

你可以尝试一下这个链接:

 function createSymbolicLinks ($source, $destination, [switch]$recurse) { Get-ChildItem $source -Recurse:$recurse | ? { !$_.PSISContainer } | % { $destpath = $_.Fullname -replace [regex]::Escape($source), $destination if(!(Test-Path (Split-Path $destpath))) { #Create missing subfolders New-Item (Split-Path $destpath) -ItemType Directory -Force | Out-Null } cmd /c mklink $destpath $($_.FullName) | Out-Null } } #Create symbolic links in c:\folderC for all files in d:\folderD(with recursive search) createSymbolicLinks -source d:\folderD -destination c:\folderC -recurse 

我相信这将失败,如果相同的文件名已经存在于c:\folderc 。 因此,如果您需要使用c:\folderc中的符号链接替换c:\folderc的文件,则需要对其进行扩展以删除现有文件。

更新:这只会与recurse选项一起下降。 这不是最漂亮的解决方案,但它应该工作。

 function createSymbolicLinks ($source, $destination, [switch]$recurse) { Get-ChildItem $source | % { if($_.PSIsContainer -and $recurse) { Get-ChildItem $_.FullName } else { $_ } } | ? { !$_.PSIsContainer } | % { $destpath = $_.Fullname -replace [regex]::Escape($source), $destination if(!(Test-Path (Split-Path $destpath))) { #Create missing subfolders New-Item (Split-Path $destpath) -ItemType Directory -Force | Out-Null } cmd /c mklink $destpath $($_.FullName) | Out-Null } } #Create symbolic links in c:\folderC for all files in d:\folderD(with recursive search) createSymbolicLinks -source d:\folderD -destination c:\folderC -recurse 

PS:首先,我想使用硬链接,但似乎是不可能的。

硬链接只能在同一个文件系统中使用:它们不能跨越不同的驱动器(包括使用重解析点来避免驱动器号)。

其次,Windows中的“符号链接”是一个shell(即Windows资源管理器)的制品。 他们只会在应用程序使用shell命名空间(大多数不使用)的情况下工作。

最好避免。

另一种方式。 在.bat文件中,我使用这个:`for / f“delims =”%%我在('dir / b / s * .jpg * .jpeg * .png * .gif')do(链接名称= a文件夹路径+数字+ %%〜nxi mklink链接名称“%% i”>> log.txt)

解释:for / f …在子文件夹中选择的目录中循环,%% i是在路径(文件夹\子文件夹\ one_file.ext)中找到的文件的名称。
%% i〜nxi是没有路径(n)和范围(x)的名字。 mklinkcréate链接%%我工作。 我的问题是不同的。 在2台电脑中,我可以浏览所有的符号链接(所有的文件夹和子文件夹),但在第三,不完全。 但硬链接,一切正常(与mklink / H)请阅读我的问题的结束。 谢谢