0

我一直在尝试从多个来源建立符号链接。

reg.txt在目录中有一个文件new以及 sort.bat。

: reg.txt-

redcar1=123456
greencar2=345678

vehicles使用 'reg_numbers' 的子目录调用的目录中,即:-在该目录中,我有一个名为或123456的子目录,其中包含一个文件。keyskey*.txt

我想将所有“reg_numbers”(解析reg.txt- 在进程中更改文件夹名称)目录符号链接到newsort.bat 文件所在的目录,以及所有keysKey目录文件(*.txt)到一个公共keys目录在new文件夹中

所以说:-

  • D:\vehicles\123456\keys\this.txt
  • D:\vehicles\345678\key\that.txt

符号链接

  • e:\new\redcar1\
  • e:\new\greencar2\
  • e:\new\keys\this.txt
  • e:\new\keys\that.txt

sort.bat 在新文件夹中。

@echo off
setlocal EnableDelayedExpansion

set NEWPATH=%~dp0
set OLDPATH=d:\vehicles

for /f %%d in ('dir /b %NEWPATH%\keys') do (
    if not "%%d"=="not.txt" del /Q "%NEWPATH%Keys\%%d" ::clean out files
)
for /f "tokens=1,2 delims=="  %%a in (reg.txt) do (
    rmdir /Q "%NEWPATH%%%a" ::clean out dir
    mklink /D %NEWPATH%"%%a" %OLDPATH%\"%%b"
    for /f %%c in ('dir /b %OLDPATH%\%%b\keys' ) do (

    mklink %NEWPATH%Keys\"%%c" %OLDPATH%\"%%b"\"%%c" 
    )
)

这可能是一团糟,但它几乎适用于所有东西,但我无法获取that.txtfromkey文件夹。

4

1 回答 1

0
@echo off
setlocal EnableDelayedExpansion

set "NEWPATH=%~dp0"
set "OLDPATH=D:\vehicles"

for /f %%A in ('2^>nul dir /b /a-d "%NEWPATH%\keys"') do (
    if not "%%~A" == "not.txt" del /Q "%NEWPATH%\Keys\%%~A"
)

for /f "usebackq tokens=1,2 delims==" %%A in ("%NEWPATH%\reg.txt") do (
    rmdir /Q "%NEWPATH%\%%~A"
    mklink /D "%NEWPATH%\%%~A" "%OLDPATH%\%%~B"

    for /f %%C in ('2^>nul dir /b "%OLDPATH%\%%~B\keys" "%OLDPATH%\%%~B\key"' ) do (
        mklink "%NEWPATH%\Keys\%%~C" "%OLDPATH%\%%~B\%%~C"
    )
)

这可能有助于获取文件的符号链接this.txtthat.txt. 您有一个keys文件夹和一个key文件夹,但您的代码只搜索其中一个的目录。所以现在dir将搜索这两个目录。

我还调整~for变量中的引用和使用以删除可能的引用。在需要的地方添加反斜杠作为路径分隔符。

set 命令的双引号是为了确保该值不包含任何不可见的尾随空格。

2^>nul命令中的for是将 stderr 流重定向到nul,因此不会输出找不到文件的dir输出。

usebackqfor选项中更改命令的规则。不带usebackq, 的双引号将双引号解释为字符串,而不是路径。使用usebackq, 双引号可以在路径上使用。%~dp0是一条可能有空格的路径,因此添加双引号似乎是个好主意。查看for /?更多帮助。

于 2020-03-29T08:07:58.550 回答