win7/10中以管理员身份运行bat脚本时,获取当前文件所在目录

本文主要是介绍win7/10中以管理员身份运行bat脚本时,获取当前文件所在目录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此命令适用于bat双击正常打开,以管理员打开闪退的情况

以下为转载,地址http://blog.chinaunix.net/uid-27000874-id-3224772.html

知道windowsbat脚本很强大,但是具体命令向来很少接触,今天在win7上运行自己以前写的一个安装mysql数据库到系统服务的脚本时,遇到一些问题,下面记录一下。

问题:mysql服务安装脚本在win7下运行失败

原因:win7下,以右键的“以管理员身份运行”默认进入的目录是C:\Windows\System32目录,因此后续的cd Demo_V2.0.4.9命令肯定进入不到正确的目录

解决办法:使用cd /d %~dp0

首先,脚本如下,对具体StartDemo.bat命令不多做解释

cd Demo_V2.0.4.9

cd mysql

@echo off

set MYSQL_HOME=%cd%

net stop "DemoMySql"

call "%MYSQL_HOME%\bin\mysqld.exe" remove  DemoMySql

call "%MYSQL_HOME%\bin\mysqld.exe" install DemoMySql --defaults-file="%MYSQL_HOME%\bin\my.ini"

net start "DemoMySql"

cd..

cd..

这个脚本在xp20002003等系统中都可以正常双击运行。在win7系统中双击运行时,会以普通用户身份运行,此时所获取的文件路径的确是当前路径,而不是C:\Windows\System32但是运行到卸载以及安装DemoMysql的系统服务时,普通用户显然权限是不够的。

于是在StartDemo.bat右键选择“以管理员身份运行”,此时又会出问题,win7可能出于安全问题考虑,此时获得的目录是C:\Windows\System32于是后面的执行都会出错或者无效。

此时在脚本开始尝试加入命令cd %cd%,来获取当前路径,实验得知,这行语句在xp等系统中有效,但是在win7中依然无效。得到的目录依然是C:\Windows\System32

上网查了一下才知道要使用cd /d %~dp0命令来获取脚本所在的目录。在脚本最开始添加cd /d %~dp0即可。之后在xp系统上运行此脚本,确认也没有问题。下面对命令中涉及到的参数做一解释。

问题解释一:关于cd/d参数

关于cd /d参数,在cmd中敲入cd /?

可以看到/d参数的解释如下:

使用 /D 命令行开关,除了改变驱动器的当前目录之外,

还可改变当前驱动器。

这句话貌似不太好理解,我做个试验给大家看就明白了:

通常我们在xp系统中打开cmd窗口时,会显示

C:\Documents and Settings\Administrator>

如果我们执行如下命令,发现目录依然还是在C:\Documents and Settings\Administrator

C:\Documents and Settings\Administrator>cd d:\tomcat6.0.18

C:\Documents and Settings\Administrator>

此时,我们键入d:,不但会切换到d盘,而且会切换到d:/tomcat6.0.18的目录

C:\Documents and Settings\Administrator>cd d:\tomcat6.0.18

C:\Documents and Settings\Administrator>d:

D:\tomcat6.0.18>

下面语句我们就能看到/d参数的作用了。发现加了/d参数之后直接切换到d盘的tomcat6.0.18目录了。

C:\Documents and Settings\Administrator>cd /d d:\tomcat6.0.18

D:\tomcat6.0.18>

结论:不加/d参数只能在同一驱动器的目录之间切换,加上/d参数则能在不同驱动器之间的目录之间切换

问题解释二:关于%~dp0的批处理命令的详细解释

对此命令并不清楚,以下内容都来自互联网:

%~dp0 “d”Drive的缩写,即为驱动器,磁盘、“p”Path缩写,即为路径,目录

cd是转到这个目录,不过我觉得cd /d %~dp0 还好些

选项语法:

    ~0         - 删除任何引号("),扩充 %0

    %~f0        - 将 %0 扩充到一个完全合格的路径名(“f”file,即文件)

    %~d0        - 仅将 %0 扩充到一个驱动器号

    %~p0        - 仅将 %0 扩充到一个路径

    %~n0        - 仅将 %0 扩充到一个文件名(“n”name 文件名)

    %~x0        - 仅将 %0 扩充到一个文件扩展名

    %~s0        - 扩充的路径只含有短名(“s”Short,短的)

    %~a0        - 将 %0 扩充到文件的文件属性(“a”attribute,即属性)

    %~t0        - 将 %0 扩充到文件的日期/时间(“t”time)

    %~z0        - 将 %0 扩充到文件的大小(Size 大小)

    %~$PATH:0   - 查找列在路径环境变量的目录,并将 %0 扩充

                  到找到的第一个完全合格的名称。如果环境变量名

                  未被定义,或者没有找到文件,此组合键会扩充到

                  空字符串

可以组合修饰符来得到多重结果:

    %~dp0       - 仅将 %0 扩充到一个驱动器号和路径

    %~nx0       - 仅将 %0 扩充到一个文件名和扩展名

    %~fs0       - 仅将 %0 扩充到一个带有短名的完整路径名

    %~dp$PATH:0 - 查找列在路径环境变量的目录,并将 %I 扩充

                  到找到的第一个驱动器号和路径。

    %~ftza0     - 将 %0 扩充到类似输出线路的 DIR

%0为当前批处理文件

如果0换成1为第一个文件,2为第2

****************************************************

%0代指批处理文件自身

%~d0 是指批处理所在的盘符

%~dp0 是盘符加路径

cd %~dp0 就是进入批处理所在目录了

这篇关于win7/10中以管理员身份运行bat脚本时,获取当前文件所在目录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932136

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文