Board logo

标题: [文件操作] [已解]批处理如何获取自身当前所在目录/文件夹的路径? [打印本页]

作者: huyou96    时间: 2016-10-22 12:01     标题: [已解]批处理如何获取自身当前所在目录/文件夹的路径?

本帖最后由 huyou96 于 2016-10-22 14:01 编辑

一个批处理文件如何在执行过程中判读它自身所处文件夹位置?
比如,某个批处理文件,假如它的内容里有一条拷贝它自身的语句,由于该批处理不一定被放置在固定文件夹位置,有可能被在各个文件夹移来移去的,它自己的文件名也有可能变来变去的,所以想要它在执行对自身拷贝过程中判断一下它自身所在文件夹,并取到该位置的路径作为运行指令的变量参数来使用,这该怎样才做得到?
作者: aa77dd@163.com    时间: 2016-10-22 12:42

  1. @echo off
  2. echo;"%~f0"
  3. echo;"%~n0"
  4. echo;"%~x0"
  5. echo;"%~dp0"
  6. echo;"%~dpnx0"
  7. echo;"%~t0"
  8. echo;"%~z0Bytes"
  9. pause
  10. exit /b
复制代码
回复 1# huyou96
作者: 523066680    时间: 2016-10-22 12:50

在目录中乱窜的批处理
作者: aa77dd@163.com    时间: 2016-10-22 13:08

玩3楼游戏前, 请先设置 Find My bAt 功能 为打开状态

  1. start "" "%~dp0"
复制代码

作者: huyou96    时间: 2016-10-22 14:12

回复 2# aa77dd@163.com

谢谢!再谢谢!
第六行"%~dp0"正解。想不到~这样妙用。
原来%0指批处理文件它自身,而d是drive即盘符,p是path即路径,这样"%~dp0"就取到了它自身的全路径。大虾再次使我茅塞顿开,佩服!听君一席谈,胜看十年网。

作者: Batcher    时间: 2016-10-22 15:15

for命令教程第6页有例子
http://bbs.bathome.net/thread-31727-1-1.html
作者: huyou96    时间: 2016-10-22 15:36

回复 6# Batcher


  谢谢!
作者: huyou96    时间: 2016-10-22 18:37

本帖最后由 huyou96 于 2016-10-23 10:44 编辑

回复 4# aa77dd@163.com


再请教您一下字符串截取的问题,我这里运行 echo;"%~dp0" 的结果如下:
"C:\Users\Huyou\Documents\"

但我想要去掉该字符串最后一个反斜杠字符,就是说我想要echo输出的格式如下:
"C:\Users\Huyou\Documents"

请问我该如何做?
(曾按论坛的截取字符串的简单例子
set str=123456789
echo 去掉最后一个字符后的字符串为:%str:~0,-1%,
试验过  echo "%(%%~dp0%):~0,-1%"
但一试就失败了,输出结果是:"C:\Users\Huyou\Documents\~0,-1"
还试了 echo "%(%%~dp0%:~0,-1%)%"
输出结果是:"C:\Users\Huyou\Documents\:~0,-1"
好失败啊


补充:还是我太菜了。
明白了,原来不必想得那么复杂,只消 echo %0 输出结果就是不带反斜杠的"C:\Users\Huyou\Documents"
而echo "%~dp0" 结果是带反斜杠的 "C:\Users\Huyou\Documents\"

是我太笨了,总想不明白……

再补充,到晚上就糊涂了,刚才的还是错了。要写到只有一行就显示出 "C:\Users\Huyou\Documents" 不带反斜杠的路径结果,我的水平只能多设置一步变量写成如下这样:
set mydir="%~dp0" && echo %mydir:~0,-1%
不知其他大虾有没有其他更好的方法?

再再补充:昨晚还是设置变量菜了,path是系统环境变量不该用于批处理里,因会导致系统环境变量更改重置,故修改为mydir,这样就OK了。

还在批处理里用xcopy、copy么,你out啦,新写脚本都该采用鲁棒拷贝robocopy,带用参数连时间戳等等都能保留,拷贝文件夹或文件都强大又好用,唯一值得注意地方是无论拷贝文件还是拷贝文件夹,作为来源或目标文件夹参数的路径里不能带有最末字符反斜杠,否则执行时会报错。只消把路径里最后一个反斜杠去掉即可。

像如下这样就都会报错:

✖        robocopy "C:\Users\Huyou\Downloads\" "C:\Users\Huyou\Documents\"

✖        robocopy "C:\Users\Huyou\Downloads\" "C:\Users\Huyou\Documents"

✖        robocopy "C:\Users\Huyou\Downloads" "C:\Users\Huyou\Documents\" mytest.bat

✖        robocopy "%HomePath%\Downloads\" "%HomePath%\Documents\"

✖        robocopy "%~dp0" "%UserProfile%\Documents" mytest.bat

正确的,应该如下这样子:

✔        robocopy "C:\Users\Huyou\Downloads" "C:\Users\Huyou\Documents"

✔        robocopy "C:\Users\Huyou\Downloads" "C:\Users\Huyou\Documents" "mytest.bat"

✔        robocopy "%UserProfile%\Downloads" "%UserProfile%\Documents"

✔        set mydir=%~dp0 && robocopy "%mydir:~0,-1%" "%HomePath%\Documents" mytest.bat
作者: aa77dd@163.com    时间: 2016-10-23 10:44

本帖最后由 aa77dd@163.com 于 2016-10-23 11:01 编辑

回复 8# huyou96

下面只是示例, 不建议如此运用
  1. @echo off
  2. REM 这些只是示例, 也不保证一定显示出本文件所在目录, 和本文件的打开方式是有关的
  3. REM 如果是双击本文件图标方式, 会显示本文件所在目录
  4. echo;%cd%
  5. call echo %%=%~d0%%
  6. call set "pp=%%=%~d0%%"
  7. set pp
  8. pause
  9. exit
复制代码
建议的方式是 截掉最后一个 \
  1. @echo off & setlocal enableDelayedExpansion
  2. set "selfpath=%~dp0"
  3. set "selfpath=!selfpath:~0,-1!"
  4. set selfpath
  5. pause
  6. exit
复制代码

作者: aa77dd@163.com    时间: 2016-10-23 10:55

本帖最后由 aa77dd@163.com 于 2016-10-23 11:08 编辑

回复 8# huyou96

楼主如果经常要用批处理, 有这些学习资源:

微软官方文档 ntcmds.chm
http://bbs.bathome.net/viewthread.php?tid=3926

cmd 的 help 命令
所有内部/外部命令的 /? 参数

本论坛上较多的教程示例帖及视频, 对官方文档错漏不足有补充
作者: huyou96    时间: 2016-10-23 10:58

回复 9# aa77dd@163.com

谢谢!谢谢!太谢谢啦!再次受教啦!

昨天憋了很长时间才明白不能一步到位截取字符串道理,跟着您修炼涨功力啊,叩谢!  

你这个用法又让我茅塞顿开受益匪浅!谢谢啊,我主要截取最末一个反斜杠字符用于robocopy指令,虽然该指令在运行结果统计列表里的源路径和目标路径都显示带有反斜杠,但是在命令里却不能带有反斜杠否则就会出错执行不了。所以我先是忘了这个茬,待我醒悟过来去追问您请教,您当时又不在,我自个憋了很长时间才有所开窍,现在您举例使我更清醒了,感觉好棒!最近可能要忙些了,待有空多多来此跟您请教啦!再谢!   
作者: huyou96    时间: 2016-10-23 11:05

本帖最后由 huyou96 于 2016-10-23 11:41 编辑

回复 10# aa77dd@163.com


太谢谢啦!功力的长进还得靠努力学习,不才承教啦!待有空我系统学下那些复杂的用法,把for,if,变量的各种用法都搞门清了,省得总是菜来菜去,基本问题都拎不清,我就没怎么系统學一下批处理的,都是草莽出身蛮干乱试,酱肯定不行滴。谢谢啦,得空一定好好研读!还有昨天说到的任务计划程序的事件触发器,待我有空自个多试验钻研了,根据系统事件日志去尝试找些系统事件来试验,估计只要花功夫会有长进的。再次叩谢您啦!

补充:
ntcmds.chm已经下载,确实讲的很棒,看资料还是看英文原文更能长进,原因在于中文翻译用词混乱造成往往理解不到位,简单举例比如view我看到微软中国的人在几乎同一个地方,比如资源管理器等等地方还有许多技术资料上,有时翻译成“查看”有时译为“视图”等等,tile有时译为排列有时译为平铺还有时译为磁贴,等等等等,都造成阅读障碍了,不如去读英文原文才理解到位了。这个英文讲解命令参考真的不错了,得空细细钻研啦。
作者: WHY    时间: 2016-10-23 11:31

也可以用 for 截取,举例:
  1. for %%i in ("%~dp0.") do echo;%%~fi
复制代码

作者: huyou96    时间: 2016-10-23 11:43

回复 13# WHY

非常感谢!真是八仙过海各显神通,各位大虾的指教真令不才受益匪浅!叩拜!
  




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