在cmd/bat脚本中获取当前脚本文件所在目录

2023-11-05

Q:在Win7/Win10中以管理员身份运行在cmd/bat脚本时,如何获取当前脚本文件所在目录?

    当我们在Win7/Win10中使用鼠标右键的“以管理员身份运行”以管理员身份运行cmd/bat脚本时,系统默认进入的目录是C:\Windows\System32目录,因此cmd脚本文件中的相应命令因路径不对提示找不到要执行的程序文件等提示。

netpay_Service.exe -install
netpay_Monitor.exe -install
A:解决办法:使用cd /d %~dp0,先进入cmd/bat脚本所在的目录,再去执行其他命令。
netpay_Service.exe -install
netpay_Monitor.exe -install

    这个脚本在xp、2000、2003等系统中都可以正常双击运行。在win7/Win10系统中双击运行时,会以普通用户身份运行,此时所获取的文件路径的确是当前路径,而不是C:\Windows\System32。但是运行到安装netpay_Service.exe -install 的系统服务时,普通用户显然权限是不够的。

    于是在InstllSvc_En.cmd右键选择“以管理员身份运行”,此时又会出问题,win7/win10可能出于安全问题考虑,此时获得的目录是C:\Windows\System32,于是提示netpay_Service.exe命令无效或程序文件不存在,执行出错。

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

   百度一下才知道要使用cd /d %~dp0命令来获取脚本所在的目录。在脚本最开始添加cd /d %~dp0即可,如下:

cd /d %~dp0
netpay_Service.exe -install
netpay_Monitor.exe -install

    在Windows XP~Windows 10系统上运行此脚本,确认都没有问题。下面对命令中涉及到的参数做一解释。

一、关于cd的/d参数
关于cd 的/d参数,在cmd中敲入cd /?
可以看到/d参数的解释如下:

使用 /D 命令行开关,除了改变驱动器的当前目录之外,还可改变当前驱动器。这句话不太好理解,我做个试验:

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

C:\users\Administrator>

如果我们执行“cd e:\xxx”命令,发现目录依然还是在C:\users\Administrator

此时,我们键入e:,不但会切换到d盘,而且会会发现E盘上的当前目录为e:/xxx。

C:\users\Administrator>cd e:\xxx
C:\users\Administrator>e:
e:\xxx>

下面语句我们就能看到/d参数的作用了。发现加了/d参数之后直接切换到e:\xxx目录了。
C:\users\Administrator>cd /d e:\xxx
e:\xxx>
结论:不加/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 就是进入批处理所在目录了


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在cmd/bat脚本中获取当前脚本文件所在目录 的相关文章

  • 如何在没有文档的情况下重构一个 10000 行的 Delphi 单元?

    我被分配了重构 Delphi 单元的任务 哇 10000 行代码 没有文档 大量的复制和粘贴代码 有很多用复制和粘贴制作的方法可以重构 无论如何 我迷失在所有这些行中 我有界面部分 我可以在其中 找到我的路 但总的来说 你建议如何处理此类任
  • VS Code 终端无法识别 PATH 变量

    我在 PATH 中添加了一个目录 但 VS Code 中的终端无法识别我尝试从该目录运行的命令 exe 终端使用 cmd 而不是 power shell 我缺少什么 重新启动我的计算机 它就工作了 显然 VS Code 无法识别这些更改
  • 使用局部函数和全局函数哪个更优化?

    我想知道使用 a 是否更优化局部功能 在下面的例子中 drawBitmap 只需要3个参数 and 无法内联因为该函数访问一些所有者过程变量 或者使用可以内联的全局函数 但它真的会内联吗 这需要5个参数 也不知道这是否重要 但是这段代码主要
  • Delphi:如何在不使用 MAPI 的情况下在 Outlook 中撰写电子邮件?

    在这个问题中我只是问 https stackoverflow com questions 4907143 ideas for storing e mail messages in a delphi client server applica
  • Delphi 远程调试器冻结

    我有运行 Delphi 2007 应用程序的 Windows Server 2008 R2 计算机 Update 当前无法切换 Delphi 版本 我有 Delphi XE 但在进行任何切换之前需要检查超过 300 000 行代码 我遇到了
  • 有没有办法获取正在运行或新打开的资源管理器窗口的 IExplorerBrowser 接口以供后续 BrowseToXXX 调用?

    这么问是因为在上一个问题 https stackoverflow com questions 6220899 answer 6221898我是指向 IExplorerBrowser 的指针 但是它创建了一个子窗口 而我想模拟资源管理器的 查
  • 如何在 Delphi 中更改 TabControl 中活动 TAB 的颜色

    如何更改 TabControl 在 FireMonkey 上 中活动 TAB 的颜色 如下所示 有两种方法可以实现这一点 1 第一个选项是您可以创建定制风格 for 选项卡控件 from T样本 风格设计师 然后您可以添加您想要在自定义设计
  • Delphi 2009之前如何处理UTF-8和ANSI转换?

    在 Delphi 2009 中 我们有 RichEdit1 Lines LoadFromFile OpenDialog1 FileName TEncoding UTF8 RichEdit1 Lines SaveToFile OpenDial
  • 将 TPopupMenu 与窗体的右侧对齐?

    TPopupMenu 如何与窗体的右侧对齐 问题是 在调用之前似乎没有办法获取弹出菜单的宽度Popup X Y Integer 我正在尝试获得与 Chrome 中的系统菜单类似的行为 你也可以只设置Alignment http docwik
  • Powershell调用cmd.exe命令,如copy /b

    我已经看到这个了在 Powershell 中快速且简单地连接二进制文件 https stackoverflow com questions 1783554 fast and simple binary concatenate files i
  • 如何测试 Windows (10) 上是否安装了 Python,如果未安装则运行 exe 来安装它?

    仅当第一个命令失败时 我才需要在 Windows cmd 上运行第二个命令 在另一个场景中 我想在检查 python setup 是否安装后打开它 我用了这个命令 python version path to python install
  • 在 Pascal 中将文本文件中的字符串读入数组

    使用这个程序 我试图读取一个文件并将其随机打印到控制台 我想知道是否必须使用数组 例如 我可以将字符串分配到一个数组中 然后从数组中随机打印 但是 我不确定如何解决这个问题 另一个问题是 我当前的程序没有从我的文件中读取第一行 我有一个文本
  • 批处理文件中的 %* 是什么意思?

    我见过的用法 在批处理文件和命令行中 有人可以解释一下的典型用法吗 有一个例子吗 它的意思是 命令行中的所有参数 例如 当您想要将命令行从批处理文件转发到另一个程序时 它非常有用 REM mybatchfile cmd echo You c
  • 以与文件大小相同的格式获取类或对象的大小?

    如何从内存中最好地确定类的大小 这是一个可以使用的基本示例类 请注意 这些变量除了用于示例之外没有其他用途 type TMyClass class public fString1 string fString2 string fIntege
  • Delphi LZMA减压样本

    我发现在this https stackoverflow com questions 4344976 lzma or 7zip in delphi的线程链接delphi压缩包 https github com ccy delphi zip具
  • 线程关闭期间 Win64 Delphi RTL 中的内存泄漏?

    很长一段时间以来 我注意到我的服务器应用程序的 Win64 版本存在内存泄漏问题 虽然 Win32 版本工作正常 内存占用相对稳定 但 64 位版本使用的内存却定期增加 可能 20Mb 天 没有任何明显的原因 不用说 FastMM4 没有报
  • Firemonkey - 更新视觉组件

    我们从版本 1 开始就使用 Firemonkey 但仍然发现更新当前在屏幕上可见的组件很困难 在 Firemonkey 中请求重画的 方式 有很多 也许太多了 应用样式 ApplyStyle 事件 主要是当它在屏幕上可见时 请求 repai
  • 在 C# 中将参数传递给 .cmd 文件

    我有一个 cmd 文件 它要求用户输入 并根据该输入执行进一步的步骤 我正在尝试编写一个程序来在 C 中自动执行此过程 以便命令提示符在后台运行 不会弹出给用户 消除所有用户交互 并且传递参数 我参考了多个答案 但没有找到解决方案 我已经提
  • 使用命令提示符查找 CPU 数量和每个 CPU 的核心数

    我正在尝试使用命令提示符检索 CPU 数量和每个 CPU 的核心数 我已经执行了以下命令 wmic cpu get NumberOfCores NumberOfLogicalProcessors Format List 我收到此错误 wmi
  • 在批处理脚本中发送 Windows 密钥

    我最近一直在使用SendKeys使用批处理脚本的函数 我已经了解如何在窗口中输入某些键 例如 Tab 键 SendKeys TAB 或者退格键 SendKeys BACKSPACE 但我一直尝试在不按Windows键的情况下输入它 不幸的是

随机推荐

  • 面经-hangzhou

    目录 上篇 一 基础篇 网络基础 TCP三次握手 HTTP协议 浏览器输入URL过程 操作系统基础 进程和线程的区别 操作系统内存管理 Java基础 面向对象三大特性 数据结构 设计模式与原则 面试题 构造方法 初始化块 This 重写和重
  • C# 获取FormData数据

    通常的方法是你创建一个 FormData 对象 然后你使用append方法来加入任何额外的key和他们的值 就像这样 var form new FormData form append myName Robert 然后你只需使用XMLHtt
  • dataframe 判断是否为空的解决方式,即判断是否为NAN

    利用pd read table 读出来的数据 如果存在空值的 补充为 1 若x是dataframe中emp length列里面的其中一个值 判断其是否为空用什么 x is None 没起作用 len x 0 提示float 没有len np
  • IPSec的配置实现实验报告

    IPSec的配置实现 一 实验目的 二 实验环境 三 实验原理 四 实验步骤及结果 五 实验总结 一 实验目的 1 在Windows中配置 内置或者专有 IPSec 2 通过抓包工具抓取建立IPSec的协商密钥过程 和建立之后的加密通信数据
  • 浏览器禁用ajax,禁用浏览器缓存Ajax请求

    java period lang period OutOfMemoryError colon Java heap space解决办法 进入到tomcat bin目录下 编辑catalina bat 在这个文件最前面加入一句 set JAVA
  • ue4场景没阴影_UE4建筑室内可视化解决漏光和提高阴影质量的方法

    https zhuanlan zhihu com p 114539616 把建筑室内模型导入到UE4场景中 默认的情况如图01 在这个场景中只使用了定向光源 Light Source 来照明 墙壁与地板之间有明显的漏光 阴影生硬不真实 我们
  • Qt的下载与安装说明(超全!)

    Qt的下载与安装说明 下载说明 一打开浏览器输入https www qt io 来到Qt的官网 点击Developers Get Started 下滑到这这里 点击here 选择我们的需要的版本点击 in the archive 这个网页打
  • ISBN码书籍信息查询

    小程序 有书乐享 第一版已正式上线 在做这个小程序的过程中 有个扫一扫功能 通过书籍的ISBN码扫描后进行书籍分享 而网上找到的方式 要不提供的接口很久 无法请求 要不就是收费 总之让人折腾 因此基于这种情况 基于现有的小程序实现功能提供接
  • 重磅报告

    过去5年 是中国互联网创新飞跃的五年 中国从具有先天人口优势的网络大国逐步迈向技术创新驱动的网络强国 我国互联网产业在5年里究竟发生了哪些变化 阿里研究院发布报告 创新飞跃的五年 10大关键词解读中国互联网 报告基于丰富的数据 以及鲜活的案
  • ArcGis10.2详细安装步骤

    目录 1 安装License Manager10 2 2 复制试用文件 3 安装ArcGis Desktop10 2中文版 4 更新本地许可 提供arcgis下载地址 暂时评论区留邮箱吧 下载之后会得到以下3个目录 按顺序进行操作或者安装
  • QT笔记- 队列信号槽绑定与自定义类型

    说明 使用Qt QueuedConnection队列绑定时 某些默认非队列绑定时可用的自定义类型此时会不可用 如自定义枚举类型 此错误Qt不会报错和提示 解决 在绑定前使用qRegisterMetaType
  • http、websocket、长连接、短连接(一)

    http websocket 长连接 短连接 一 http websocket 长连接 短连接 二 这一篇先讲一下http的长短连接的问题 1 HTTP协议与TCP IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接 HT
  • NetMonitor抓不到网卡

    在powershell 或Dos下输入命令 bcdedit set testsigning on 操作目的 打开系统的testSigning模式 使得非权威CA发放的签名可以使用
  • Type string trivially inferred from a string literal, remove type annotation (no-inferrable-types)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt TypeScript代码 private goY string www baidu com 会导致tslint报错 Type string trivially inferr
  • 华为OD机试 - 观看文艺汇演问题(Java)

    题目描述 为了庆祝中国共产党成立100周年 某公园将举行多场文艺表演 很多演出都是同时进行 一个人只能同时观看一场演出 且不能迟到早退 由于演出分布在不同的演出场地 所以连续观看的演出最少有15分钟的时间间隔 小明是一个狂热的文艺迷 想观看
  • 自动单选题批改程序C语言,标准单选题考试系统,又出问题了,求指教,怎么就串行了呢?...

    include include cls include toupper include time include malloctypedef struct char question 200 A 100 B 100 C 100 D 100
  • 拒绝后门程序-Alibabaprotect和AliPaladin

    详细参考帖子及评论区 流氓进程AlibabaProtect的删除 程序员吧 百度贴吧 首先打开服务找到AlibabaProtect 然后找到他的位置 C Program Files x86 AlibabaProtect 这个目录下有个uni
  • 巧解高并发之福利抽奖

    随着互联网的发展 高并发问题几乎是每个企业都会面临的问题 而目前解决高并发最受欢迎的便是微服务 通过类似于增加服务器数量而达到一种 人多力量大的 效果 但是 类似方法均需要技术及资本的支持 而当现有技术和资本不达标时 一切都是空谈 那么当技
  • mysql 数据多表join

    0 索引 JOIN语句的执行顺序 INNER LEFT RIGHT FULL JOIN的区别 ON和WHERE的区别 1 概述 一个完整的SQL语句中会被拆分成多个子句 子句的执行过程中会产生虚拟表 vt 但是结果只返回最后一张虚拟表 从这
  • 在cmd/bat脚本中获取当前脚本文件所在目录

    Q 在Win7 Win10中以管理员身份运行在cmd bat脚本时 如何获取当前脚本文件所在目录 当我们在Win7 Win10中使用鼠标右键的 以管理员身份运行 以管理员身份运行cmd bat脚本时 系统默认进入的目录是C Windows