Board logo

标题: [文件操作] [已解决]BAT如何截取第一个输入路径的最后目录名? [打印本页]

作者: Nano    时间: 2010-1-11 17:58     标题: [已解决]BAT如何截取第一个输入路径的最后目录名?

BAT中如何截取第一个输入路径的最后目录名加在第二个输入路径的后边使用
set /p src=c:\fee\mm
set /p dest=d:\jk
如何能让%dest%变量值变成d:\jk\mm
for %%a in ("%src:"=%") do set dest="%dest:"=%\%%~nxa"
PS:我知道文件的符號鏈接不用參數直接 Mklink 就行了可是我不知道怎麼讓BAT判斷輸入的是路徑還是文件IF怎麼用還請達人修正。。最好滑鼠拖拽的是文件就用Mklink 要是目錄就用Mklink /j
谢谢
以下是:
在WIN7中利用Mklink進行目錄點連接或文件符號鏈接的批處理支持目錄空格。。智能判斷源為文件或是目錄分別調用參數。。感謝CN-DOS的000000000000000大大!!

  1. @echo off
  2. set "m="
  3. set /p src=[請輸入Mklink源文件路徑支持滑鼠拖拽]
  4. set /p lnk=[請輸入Link目標文件路徑支持滑鼠拖拽]
  5. set /p m=[請輸入Link目標名默認同名源文件(目錄)]
  6. set src="%src:"=%"
  7. if defined m (
  8.     set _path="%lnk:"=%\%m:"=%"
  9.     if not exist %src%\ (
  10.         for %%a in (%src%) do (
  11.             for %%b in ("%m:"=%") do (
  12.                 if "%%~xb" neq "%%~xa" set _path="%lnk:"=%\%m:"=%%%~xa"
  13.             )
  14.         )
  15.     )
  16. ) else for %%a in (%src%) do set _path="%lnk:"=%\%%~nxa"
  17. if exist %src%\ (Mklink /j %_path% %src%) else Mklink %_path% %src%
  18. pause
复制代码


[ 本帖最后由 Nano 于 2010-1-12 22:19 编辑 ]
作者: batman    时间: 2010-1-11 18:13

请参照以下代码修改:
  1. @echo off
  2. set "str=c:\pad\c mk\aaaa"
  3. for /f "delims=" %%a in ("%str%") do echo %%~na
  4. pause>nul
复制代码

作者: Nano    时间: 2010-1-11 18:37

原帖由 batman 于 2010-1-11 18:13 发表
请参照以下代码修改:@echo off
set "str=c:\pad\c mk\aaaa"
for /f "delims=" %%a in ("%str%") do echo %%~na
pause>nul

斑斑我看不懂。。我这个是从网上找的。。我只会引用%i%和%l%

能不能直接帮我写好。。

谢谢
作者: nerfg002    时间: 2010-1-11 18:46

%%~na是扩展到文件名不包含后缀(如果目标中包含.符号则会显示目标的最后一个.以前的内容)

比如你D盘上有个文件夹或者文件 a.b.c 拖放到下面的批处理上
  1. @echo off
  2. echo %1
  3. echo %~n1
  4. echo %~nx1
  5. pause
复制代码
显示
"D:\a.b.c"
a.b
a.b.c
作者: batman    时间: 2010-1-11 19:41

本论坛不欢迎伸手党!!!
作者: Nano    时间: 2010-1-11 22:53

原帖由 batman 于 2010-1-11 19:41 发表
本论坛不欢迎伸手党!!!

斑斑我不是伸手黨。。我是整合黨。。不是專業程序員。。只是想簡化下自己的工作。。
一般都是對解決的工作中的問題記憶深刻。。只有對工作有幫助才有進一步學習的動力呀。。如果我只是想簡化下日常工作還要學習個十天半月的才能用。。會不會像只是想看清畫的景物而先生卻讓先弄清畫的紙質及所用顏料等等後才能行呢。。這裡是咨詢區我才來的。。我不是專家。。只是個剛開始感興趣的人。。是不是非專業人士不能入內呢。。拒人千里。。不利後進。。有損先賢罷。。
作者: 随风    时间: 2010-1-11 23:07

呵呵
  1. @echo off
  2. set i=c:\fee\mm
  3. set L=d:\jk
  4. for /f "delims=" %%a in ("%i%") do set L=%L%\%%~na
  5. echo %L%
  6. pause
复制代码

作者: Nano    时间: 2010-1-11 23:23

原帖由 随风 于 2010-1-11 23:07 发表
呵呵@echo off
set i=c:\fee\mm
set L=d:\jk
for /f "delims=" %%a in ("%i%") do set L=%L%\%%~na
echo %L%
pause

先謝謝斑斑的代碼可是我試了下如果目錄有空格就不行了。。望修正。。再謝。。
作者: 随风    时间: 2010-1-12 00:17

不行?怎么不行?显示不了么?
作者: Nano    时间: 2010-1-12 00:20

原帖由 随风 于 2010-1-12 00:17 发表
不行?怎么不行?显示不了么?
不是顯示不了是引用不了。。新問題在頂樓。。謝謝大大
作者: 随风    时间: 2010-1-12 00:48

mklink 命令没用过,估计不能处理含空格的文件名,应该是没加引号的缘故
你试试 Mklink /J "%l%" "%i%"
另你的题意没看懂
最好滑鼠拖拽的是文件就用Mklink %l% %i%要是目錄就用Mklink /j %l% %i%
你这里有两个输入选项,你输入时两个都是一样的吗?要判断哪一个?
最好能用文字描述你的问题,因为代码有时会把人引入歧途。
作者: Nano    时间: 2010-1-12 01:09

Mklink命令是支持帶空格目錄或文件的。。
我的意思是:
第一種:[請輸入Mklink源文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\P h o  t o s"

[請輸入Link目標文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\New folder"
在這要判斷源是文件還是目錄
"D:\Users\i - Copy\New folder\P h o t o s"
Press any key to continue . . .
源是目錄
接下來執行 Mklink 帶/j參數命令
第二種:
[請輸入Mklink源文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\desktop.ini"

[請輸入Link目標文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\New folder"
在這要判斷源是文件還是目錄
"D:\Users\i - Copy\New folder\desktop這裡掉了.ini如何補上"
Press any key to continue . . .
源是文件
接下來就執行Mklink不帶任何參數的 命令
作者: Nano    时间: 2010-1-12 01:34

@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSIONFOR %%I IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (    IF EXIST %%I:\* (       CD /D %%I:       FOR /F "DELIMS=" %%A IN ('DIR /S/B 2009_*.txt 2^>nul') DO (           SET FOO=%%~NA           SET FOO=!FOO:*_=!           ECHO/!FOO!  %%A           )        )    ))PAUSE>NUL
有大大解釋下麼網上找來的看不懂。。


[ 本帖最后由 Nano 于 2010-1-12 01:38 编辑 ]
作者: batman    时间: 2010-1-12 09:53     标题: 回复 6楼 的帖子

我说两句:

1、和你一样,论坛的管理团队成员没有一个是程序员,很多学的都还不是计算机专业,都是因为热爱批处理,通过

努力自学而来,如果我们每次都是直接要别人给出代码,相信你也看不到现在的管理团队了。

2、批处理之家是批处理人的大家庭,请相信我们从没有也从不会拒人于千里之外,在此有很多和你一样起步的批处

理新人,他们正在这里学习和成长。

3、我们不能否认伸手党客观存在的这一事实,本人亲身遇到过太多这样的人,一开始都显得极其热情,一旦得到了

想要的代码和解决方案,就立马消失得无影无踪,这根本就不是学习之人!

4、本人之所以要你参照我的代码修改,就是想你自己来亲手解决问题,这样你才学得深记得牢,你如果在修改中有

不明白的地方,论坛的每个人都会为你热心解答,但问题是你自己总先要动下手吧。

5、本人再次严肃声明:本论坛不欢迎伸手党!!!

[ 本帖最后由 batman 于 2010-1-12 09:54 编辑 ]
作者: batman    时间: 2010-1-12 10:19

你的问题真的很好解决,唉:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p i=[請輸入Mklink源文件路徑支持滑鼠拖拽]
  3. ECHO.
  4. set /p l=[請輸入Link目標文件路徑支持滑鼠拖拽]
  5. for /f "delims=" %%a in ("%i%") do (
  6.      if "%%~xa" equ "" set "j=/j "
  7.      Mklink !j!"%l%\%%~nxa"
  8. )
复制代码

[ 本帖最后由 batman 于 2010-1-12 15:48 编辑 ]
作者: Nano    时间: 2010-1-12 13:42

原帖由 batman 于 2010-1-12 10:19 发表
你的问题真的很好解决,唉:@echo off&setlocal enabledelayedexpansion
set /p i=[請輸入Mklink源文件路徑支持滑鼠拖拽]
ECHO.
set /p l=[請輸入Link目標文件路徑支持滑鼠拖拽]
for /f "delims=" %%a in ("%i%" ...

斑斑出錯了
[請輸入Mklink源文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\P h o  t o s"

[請輸入Link目標文件路徑支持滑鼠拖拽]"D:\Users\i - Copy\New folder"
Parameter format not correct - "j"D:\Users\i - Copy\New folder"\P".
Press any key to continue . . .
作者: Rstv    时间: 2010-1-12 15:15

极端地问楼上
但要是一个文件根本就没有后缀怎么办呢?
(同时试答LZ“判斷輸入的是路徑還是文件”):

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

兰字是你输入或拖拽进去的变量,
红字是关键,nul:是虚设备
~S 解决目录或文件名中有空格的问题

———向bAtMAN报到。。。
作者: Rstv    时间: 2010-1-12 15:33

原帖由 Nano 于 2010-1-12 01:34 发表
@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSIONFOR %%I IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (    IF EXIST %%I:\* (       CD /D %%I:       FOR /F "DELIMS=" %%A IN ('DIR /S/B 2009_*.txt ...


set FOO=!FOO:*_=!
抄错了吧,文件名不可能有星号的呀,又不是匹配串。。。
作者: Batcher    时间: 2010-1-12 15:36     标题: 回复 18楼 的帖子

这个是set命令的字符串替换功能,参考:

set截取字符详解
http://www.bathome.net/thread-996-1-1.html

set变量字符截取点点通
http://www.bathome.net/thread-40-1-1.html

新手set截取字符练习工具
http://www.bathome.net/thread-1149-1-1.html
作者: Nano    时间: 2010-1-12 15:44

原帖由 Rstv 于 2010-1-12 15:15 发表
极端地问楼上
但要是一个文件根本就没有后缀怎么办呢?
(同时试答LZ“判斷輸入的是路徑還是文件”):

for /f "delims=" %i in ("只是名字无后缀 目录或文件待测 且有空格") do if not exist %~snxi\nul: echo ...
for /f "delims=" %i in ("%src%") do if not exist %~snxi\nul:
窗口一閃就沒了什麼也沒出現
還有上邊的BAT對不帶擴展名的文件無效已驗證。。盼達人修正
作者: Rstv    时间: 2010-1-12 18:23     标题: 回复 19楼 的帖子

嗯,,知道的。。
问题是之前有:

FOR /F "DELIMS=" %%A  IN  ('DIR /S/B 2009_*.txt 2^>nul')  DO  set  FOO=%%~nA

FOO是从文件列表里取的,怎么会有包含*的文件名,OS不允许啊!!
也怪我没把 13楼的题引用完全,不好意思了。
作者: Rstv    时间: 2010-1-12 18:54     标题: 回复 20楼 的帖子

我是直接在窗口下做的测试,你加到文件中当然要改成双%
那只是给你举的例子。。。
nx 改成 f 吧,我是在当前路径执行的,所以放到你那儿不成,
这回反复验证了,拖拽或窗口输入,有/无引号+空格都行。。。
作者: 523066680    时间: 2010-1-12 19:17

某日在linux下建立了一个名字比较有趣的文件,后面那个文件是旁边的东东,无关。



刚跑去cn-dos 。一看第一个贴还是楼主的这个主题。进去一看回复的还有batman……
真像硬链接……


[ 本帖最后由 523066680 于 2010-1-12 19:32 编辑 ]
作者: a590687    时间: 2010-1-12 19:58     标题: 楼主这个繁体字 真是头晕死了

!!!楼主这个繁体字 真是头晕死了
作者: Batcher    时间: 2010-1-12 20:48     标题: 回复 20楼 的帖子

  1. @echo off
  2. type nul >"C:\test\Bat Home"
  3. md "C:\test\Bat Cher"
  4. for /f "delims=" %%a in ("C:\test\Bat Home") do (
  5.     if exist "%%a" (
  6.         if not exist "%%a\" (
  7.             echo %%a is a file.
  8.         )
  9.     )
  10. )
  11. for /f "delims=" %%a in ("C:\test\Bat Cher") do (
  12.     if exist "%%a\" (
  13.         echo %%a is a folder.
  14.     )
  15. )
复制代码
C:\Test>test.bat
C:\test\Bat Home is a file.
C:\test\Bat Cher is a folder.

作者: 523066680    时间: 2010-1-12 22:07

我认为楼上代码很优美很漂亮,也很好理解。
有时候不必要老是追求一句话代码
(只是回忆起以前我跟风追求一句话代码,不精通结果还搞了一大堆篓子)

[ 本帖最后由 523066680 于 2010-1-12 22:11 编辑 ]




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2