Board logo

标题: [已完美解決]利用Mklink進行目錄點連接或文件符號鏈接 [打印本页]

作者: iPoint     时间: 2010-1-11 18:04    标题: [已完美解決]利用Mklink進行目錄點連接或文件符號鏈接
BAT中如何截取第一个输入路径的最后目录名加在第二个输入路径的后边使用
set /p i=c:\fee\mm
set /p l=d:\jk
如何能让%l%变量值变成d:\jk\mm


測試完美謝謝000000000000000的熱心幫助。。辛苦大大啦 。。


在WIN7中利用Mklink進行目錄點連接或文件符號鏈接的批處理支持帶空格目錄
以下代碼出自000000000000000
@echo off
set "m="
set /p src=
set /p lnk=
set /p m=
set src="%src:"=%"
if defined m (
set _path="%lnk:"=%\%m:"=%"
if not exist %src%\ (
for %%a in (%src%) do (
for %%b in ("%m:"=%") do (
if "%%~xb" neq "%%~xa" set _path="%lnk:"=%\%m:"=%%%~xa"
)
)
)
) else for %%a in (%src%) do set _path="%lnk:"=%\%%~nxa"
if exist %src%\ (Mklink /j %_path% %src%) else Mklink %_path% %src%
pause


Last edited by iPoint on 2010-1-14 at 15:23 ]

作者: clamber     时间: 2010-1-11 19:23
for %%i in (%i:\= %) do (set l=%l%\%%i)

作者: bat-zw     时间: 2010-1-11 20:09
Originally posted by clamber at 2010-1-11 19:23:
for %%i in (%i:\= %) do (set l=%l%\%%i)


如果最后一个目录名中间有空格呢,如c:\a\b\c\d e

作者: iPoint     时间: 2010-1-11 22:44
Originally posted by bat-zw at 2010-1-11 20:09:


如果最后一个目录名中间有空格呢,如c:\a\b\c\d e


對呀有空格的目錄名怎麼弄

作者: jarry0932     时间: 2010-1-11 23:39

@echo off
set i=c:\aa\bb\c d
set l=d:\ff
set i=%i: =_%
for %%i in (%i:\= %) do (set l=%l%\%%i)
set l=%l:_= %
echo %l%
pause


这样就行了

作者: BowAngel     时间: 2010-1-12 01:16
确实可以啊

作者: iPoint     时间: 2010-1-12 09:34
Originally posted by jarry0932 at 2010-1-11 23:39:

@echo off
set i=c:\aa\bb\c d
set l=d:\ff
set i=%i: =_%
for %%i in (%i:\= %) do (set l=%l%\%%i)
set l=%l:_= %
echo %l%
pause


这样就行了



"D:\Users\i - Copy\P h o t o s"

"D:\Users\i - Copy\New folder"
"D:\Users\i - Copy\New folder"\"D: Users i - Copy P h o t o s<P這裡多了D: Users i - Copy >"
Press any key to continue . . .
不行或

作者: 000000000000000     时间: 2010-1-12 13:02
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set FolderPath="%dest:"=%\%%~nxa"
echo %FolderPath%
pause

作者: iPoint     时间: 2010-1-12 13:24
Originally posted by 000000000000000 at 2010-1-12 13:02:
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set Folder ...

感謝樓上。。如果接下來我要判斷源是文件就調用Mklink
如果是目錄就調用Mklink /j 怎麼寫。。

謝謝

作者: 000000000000000     时间: 2010-1-12 13:50
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set FolderPath="%dest:"=%\%%~nxa"
if exist "%src%"\ (echo Mklink /j) else echo Mklink
pause

作者: iPoint     时间: 2010-1-12 14:22
Originally posted by 000000000000000 at 2010-1-12 13:50:
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set Folder ...

大大這段代碼運行後什麼都沒有
我的意思是源是文件就調用Mklink命令鏈接%FolderPath% %SRC%
源是目錄就調用Mklink /j 命令鏈接%FolderPath% %SRC%

作者: 000000000000000     时间: 2010-1-12 14:27    标题: re 11楼:
if exist %src%\ (echo Mklink /j) else echo Mklink

上句就是判断是文件,还是目录的,改成你的具体命令就行了。即:

if exist %src%\ (Mklink /j "%FolderPath%" "%SRC%") else Mklink "%FolderPath%" "%SRC%"


Last edited by 000000000000000 on 2010-1-12 at 14:30 ]

作者: iPoint     时间: 2010-1-12 14:38
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set FolderPath="%dest:"=%\%%~nxa"
if exist %src%\ (Mklink /j %FolderPath% %SRC%) else Mklink %FolderPath% %SRC%
pause

去掉變量前後的“”後在WIN7下運行正常。。謝謝大大

Last edited by iPoint on 2010-1-12 at 15:09 ]

作者: 000000000000000     时间: 2010-1-12 14:58
Originally posted by iPoint at 2010-1-12 14:38:
@echo off
set /p src=
set /p dest=
for %%a in ("%src:"=%") do set FolderPath=& ...

如果输入带空格的源路径而不加引号,貌似会出错。

建议改成:
@echo off
set /p src=
set /p dest=
set src="%src:"=%"
for %%a in (%src%) do set FolderPath="%dest:"=%\%%~nxa"
if exist %src%\ (echo Mklink /j %FolderPath% %SRC%) else echo Mklink %FolderPath% %SRC%
pause


Last edited by 000000000000000 on 2010-1-12 at 16:42 ]

作者: iPoint     时间: 2010-1-12 15:07
Originally posted by 000000000000000 at 2010-1-12 14:58:

如果输入带空格的源路径而不加引号,貌似会出错。

建议改成:
@echo off
set /p src=
set /p dest=
我還想問下如果有時候我不想以源文件名命名符號鏈接就是%%~nxa能手工輸入嗎
就是在set /p dest=我拖入個D:\FEE然後手工輸入FF
%FolderPath%能=D:\FEE\FF嗎

作者: 000000000000000     时间: 2010-1-12 16:19    标题: re 15楼:
输入源文件时可以手工输入名称

Last edited by 000000000000000 on 2010-1-12 at 16:31 ]

作者: iPoint     时间: 2010-1-12 16:31
Originally posted by 000000000000000 at 2010-1-12 16:19:
输入源文件时可以手工输入

我想問的是如果手工輸入後不會被for %%a in ("%src:"=%") do set dest="%dest:"=%\%%~nxa"語句替換嗎。。
-----------------------------------
引用:BATHOME.net回貼
极端地问楼上
但要是一个文件根本就没有后缀怎么办呢?
(同时试答LZ“判斷輸入的是路徑還是文件”):

for /f "delims=" %i in ("只是名字无后缀 目录或文件待测 且有空格") do if not exist %~snxi\nul: echo 这才是文件

兰字是你输入或拖拽进去的变量,
红字是关键,nul:是虚设备
~S 解决目录或文件名中有空格的问题
這是BATHOME.net上達人回的貼我測試沒有擴展名的文件真的不行。。用上
for /f "delims=" %a in ("%src%") do if not exist %~snxa\nul: echo 这才是文件
後窗口一閃就沒了。。能修改下嗎。。
謝謝。。

作者: iPoint     时间: 2010-1-12 16:44
Originally posted by 000000000000000 at 2010-1-12 16:19:
输入源文件时可以手工输入名称

Last edited by 000000000000000 on 2010-1-12 at 16:31 ]

不行的源文件不能改名改了會找不到引用項
我的意思是%%~nxa能不能設成變量。如果有輸入就優先用輸入沒有就調用源文件的尾端文件名或目錄名

作者: 000000000000000     时间: 2010-1-12 16:46
刚才14楼写错了个词,把 src 写成了 scr。。现在改回去了。
----------------------------
可以直接输入名称啊,“%%~nxa”表示的是路径中的文件名及后缀名。

作者: 000000000000000     时间: 2010-1-12 16:50
手工输入,如何判断你输入的是 文件 还是 目录 ?

Last edited by 000000000000000 on 2010-1-12 at 16:51 ]

作者: iPoint     时间: 2010-1-12 16:57
Originally posted by 000000000000000 at 2010-1-12 16:46:
刚才14楼写错了个词,把 src 写成了 scr。。现在改回去了。
----------------------------
可以直接输入名称啊,“%%~nxa”表示的是路径中的文件名及后缀名。

"D:\Users\i - Copy\P h o t o s"
"D:\Users\i - Copy\New folder"\ff
Mklink /j "D:\Users\i - Copy\New folder\ff這裡本來是要等同於P h o t o s的快捷方式的現在變成了上級目錄並因為沒有此目錄而出錯\P h o t o s" "D:\Users\i - Copy\P h
o t o s"
Press any key to continue . . .

作者: iPoint     时间: 2010-1-12 17:01
Originally posted by 000000000000000 at 2010-1-12 16:50:
手工输入,如何判断你输入的是 文件 还是 目录 ?

Last edited by 000000000000000 on 2010-1-12 at 16:51 ]

算了。。不搞那麼複雜了。。累人。。現在只想請大大幫著修正下如何處理沒有擴展名的文件還是調用Mklink命令
for /f "delims=" %i in ("只是名字无后缀 目录或文件待测 且有空格") do if not exist %~snxi\nul: echo 这才是文件
我換成
for /f "delims=" %%a in ("%src%") do if not exist %%~snxa\nul: echo 这才是文件
但是窗口一閃就沒了

作者: 000000000000000     时间: 2010-1-12 17:24
这个不行吗:


@echo off
set /p src=
set /p dest=
set src="%src:"=%"
for %%a in (%src%) do set FolderPath="%dest:"=%\%%~nxa"
if exist %src%\ (echo Mklink /j %FolderPath% %SRC%) else echo Mklink %FolderPath% %SRC%
pause


if exist test\ (echo 是目录) else echo 是文件

作者: iPoint     时间: 2010-1-12 17:39
Originally posted by 000000000000000 at 2010-1-12 17:24:
这个不行吗:



if exist test\ (echo 是目录) else echo 是文件

可以了去掉ECHO

是我沒細看復制就用了。。今天 看了太多的文章腦子一團麻。。呵呵

謝謝大大

作者: iPoint     时间: 2010-1-12 17:51
[請輸入Mklink源文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\bin"
[請輸入Link目標文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\New folder"\ff如果這裡有時候要手工輸入而不使用截取的bin怎麼實現
The system cannot find the path specified.
Press any key to continue . . .

作者: 000000000000000     时间: 2010-1-12 17:52
Originally posted by iPoint at 2010-1-12 17:51:
"D:\Users\i - Copy\bin"
"D:\Users\i - Copy\New folder"\ff如果這裡有時 ...

为什么不在 时手工输入?

作者: iPoint     时间: 2010-1-12 18:04
Originally posted by 000000000000000 at 2010-1-12 17:52:

为什么不在 时手工输入?

我只是要改鏈接指的名字如果改了源文件中的bin將鏈接到一個不存在的目錄或文件

@echo off
set /p src=
set /p lnk=
set /p m=如果這有輸入我希望實現%FolderPath%=%LNK%%M%的效果 IF還不會用請幫幫忙
set src="%src:"=%"
for %%a in (%src%) do set FolderPath="%lnk:"=%\%%~nxa"
if exist %src%\ (Mklink /j %FolderPath% %src%) else Mklink %FolderPath% %src%
pause

作者: 000000000000000     时间: 2010-1-12 18:10
手工输入的算文件还是目录?

作者: iPoint     时间: 2010-1-12 18:15
Originally posted by 000000000000000 at 2010-1-12 18:10:
手工输入的算文件还是目录?

以源為主源是.TXT文件那麼%M%就是.TXT
如果源是目錄%M%也是目錄

Last edited by iPoint on 2010-1-12 at 18:23 ]

作者: 000000000000000     时间: 2010-1-12 18:24
@echo off
set "m="
set /p src=
set /p lnk=
set /p m=
set src="%src:"=%"
if defined m (
set FolderPath="%lnk:"=%\%m:"=%"
) else (
for %%a in (%src%) do set FolderPath="%lnk:"=%\%%~nxa"
)
if exist %src%\ (Mklink /j %FolderPath% %src%) else Mklink %FolderPath% %src%
pause

作者: iPoint     时间: 2010-1-12 18:34
對文件運行沒有加上擴展名只能右鍵用記事本開啟
"D:\Users\i - Copy\desktop.ini"
"D:\Users\i - Copy\New"
dd
symbolic link created for D:\Users\i - Copy\New\dd <<===>> D:\Users\i - Copy\des
ktop.ini
Press any key to continue . . .
dd能加上.ini 嗎。。就是加上源文件的擴展名
對目錄運行完美
"D:\Users\i - Copy\New folder"
"D:\Users\i - Copy\New"
ff
Junction created for D:\Users\i - Copy\New\ff <<===>> D:\Users\i - Copy\New fold
er
Press any key to continue . . .

Last edited by iPoint on 2010-1-12 at 18:36 ]

作者: 000000000000000     时间: 2010-1-12 18:37
输入 dd.ini,目标就会变成 D:\Users\i - Copy\New\dd.ini,如果要这个结果,就不用改了。

Last edited by 000000000000000 on 2010-1-12 at 18:40 ]

作者: iPoint     时间: 2010-1-12 18:43
Originally posted by 000000000000000 at 2010-1-12 18:37:
输入 dd.ini,目标就会变成 D:\Users\i - Copy\New\dd.ini,如果要这个结果,就不用改了。

Last edited by 000000000000000 on 2010-1-12 at 18:40 ]

精益求精再改改吧。。自動填充多好。。

作者: 000000000000000     时间: 2010-1-12 18:49
什么情况下要自动填充?是否是根据源文件的后缀来填充?

Last edited by 000000000000000 on 2010-1-12 at 18:54 ]

作者: iPoint     时间: 2010-1-12 18:53
Originally posted by 000000000000000 at 2010-1-12 18:49:
什么情况下要自动填充?

Last edited by 000000000000000 on 2010-1-12 at 18:50 ]

就是源是文件的時候。。比如.ini .db .exe等。。要求擴展名與源同


再拜大大。。今天 真是辛苦你啦 。。

作者: 000000000000000     时间: 2010-1-12 20:12
修改中。。。

Last edited by 000000000000000 on 2010-1-12 at 20:23 ]

作者: iPoint     时间: 2010-1-12 20:26
Originally posted by 000000000000000 at 2010-1-12 20:12:
修改中。。。

Last edited by 000000000000000 on 2010-1-12 at 20:23 ]

在線等。。呵呵

作者: 000000000000000     时间: 2010-1-12 20:33
@echo off
set "m="
set /p src=
set /p lnk=
set /p m=
set src="%src:"=%"
if defined m (
set _path="%lnk:"=%\%m:"=%"
if not exist %src%\ (
for %%a in (%src%) do (
for %%b in ("%m:"=%") do (
if "%%~xb" neq "%%~xa" set _path="%lnk:"=%\%m:"=%%%~xa"
)
)
)
) else for %%a in (%src%) do set _path="%lnk:"=%\%%~nxa"
if exist %src%\ (Mklink /j %_path% %src%) else Mklink %_path% %src%
pause


Last edited by 000000000000000 on 2010-1-12 at 20:35 ]

作者: iPoint     时间: 2010-1-12 22:08
測試完美謝謝15零。。。再謝。。。辛苦大大啦 。。