“以pipe理员身份运行”时Windowsbatch file的起始目录

我有一个batch file是在一个目录中,并且必须从那里运行,因为它更新此目录中的文件。
这工作得很好,除非用户以pipe理员身份运行batch file(在Vista上是必需的)。 那么起始目录是C:\ Windows \ System32。

有什么办法仍然能够知道batch file从哪个目录运行?
我不希望用户手动进入目录。

尝试访问这样的batch filepath:

echo %~dp0 

有关更多信息,请参阅下面的命令for /? 它描述了上述命令是如何工作的:

您现在可以使用以下可选语法:

     %〜I  - 扩展%我删除任何周围的引号(“)
     %〜fI  - 将%I扩展为完全限定的path名​​称
     %〜dI  - 只将%I扩展为一个盘符
     %〜pI  - 仅将%I扩展到path
     %〜nI  - 只将%I扩展为文件名
     %〜xI  - 仅将%I扩展为文件扩展名
     %〜sI  - 扩展path只包含短名称
     %〜aI  - 将%I扩展到文件的文件属性
     %〜tI  - 将%I扩展到文件的date/时间
     %〜zI  - 将%I扩展为文件的大小
     %〜$ PATH:I  - searchPATH中列出的目录
                   环境variables并将%I扩展到
                   第一个find的完全合格的名字。
                   如果环境variables名称不是
                   定义或文件没有被find的
                   search,然后这个修饰符扩展到
                   空的string

修饰符可以组合得到复合结果:

     %〜dpI  - 仅将%I扩展为驱动器号和path
     %〜nxI  - 仅将%I扩展为文件名和扩展名
     %〜fsI  - 将%I扩展为仅包含短名称的完整path名称
     %〜dp $ PATH:I  - searchPATH中列出的目录
                   环境variables为%I并扩展为
                   驱动器号和find的第一个path。
     %〜ftzaI  - 将%I扩展为类似于输出行的DIR

cd更好的pushd将会

  • 如果从D:\...开始更改驱动器号
  • 如果在UNCnetworkingpath上分配驱动器号

所以pushd %~dp0是好的。

好的做法是在完成时调用popd

这应该通过将batch file的工作目录设置回当前目录来解决您的问题:

将这两行包含在.bat脚本的顶部:

 @setlocal enableextensions @cd /d "%~dp0" 

发现在: http : //www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

我用:

cd%0 ..

在batch file的开头将目录切换到启动batch file的目录。

-Mathew

你可以直接从文件名CD添加父(没有在Windows 8.xtesting,但工作“永远”,据我所知)。

 CD %FILENAME%\.. 

CD也会改变驱动器,使用/ D,这是上面显示,但没有明确提到,所以可能会错过。 CD / D%FILENAME%\ ..

(FOR /?IF /?SET /?CALL /?GOTO /?都提供非常有用的读取,如果你使用cmd.exe,我偶尔会重读一次。)

这里的工作解决scheme:

http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html

FOR / F %% I IN(“%0”)DO SET BATDIR = %%〜dpI

ECHObatch file位于目录%BATDIR%