我正在Windows 8.1机器上编写批处理文件。在我的批处理文件的一个部分中,我需要在“当前工作目录”中启动命令提示符。
到目前为止,这是我的批处理文件的样子:
@echo OFF
set WORKING=%cwd%
start cmd.exe /K pushd %WORKING%
exit
假设批处理文件位于 C:\ Temp \ Utilities 文件夹中。如果我打开一个资源管理器窗口并双击批处理文件来运行它,一切都很好。将在 C:\ Temp \ Utilities 目录中创建新的命令提示符。但是,如果我右键单击批处理文件并选择以管理员身份运行,则工作目录不再是批处理文件的位置,而是 C:\ Windows \ System32 。
同样,如果我在另一个文件夹中创建批处理文件的快捷方式(例如.C:\ Temp)并重复上面的两个步骤,结果是相同的。如果我双击快捷方式并以普通用户身份运行它,工作目录就是我所期望的。 (注意,快捷方式的工作目录是为快捷方式属性的“开始”设置的,而不是批处理文件的位置。)如果我右键单击快捷方式并以管理员身份运行它我再次打开命令提示符到文件夹 C:\ Windows \ System32 。
我认为这是Windows 8.1中的“错误”或“功能”(如果你想称之为),它可能发生,因为以管理员身份运行的程序的执行环境被强制在 System32 < / em>文件夹? (我记得在Windows 7中没有发生这种情况所以它必须是Windows 8的新功能。)
我找到了一种解决问题的方法,并停止在 C:\ Windows \ System32 中启动命令提示符。我通过修改批处理文件中的以下行来完成此操作:
set WORKING=%~dp0
这样做可以将工作目录设置为批处理文件的位置。通过此更改,无论我如何运行批处理文件或快捷方式(管理员或正常),工作目录最终都是相同的, C:\ Temp \ Utilities 。
此解决方案的问题是我不希望工作目录始终是批处理文件的位置。如果直接运行批处理文件,那么没关系,但是如果我从快捷方式运行它,我需要工作目录是该快捷方式的“开始”属性中设置的内容。例如,如果批处理文件位于 D:\ Temp \ Utilities 文件夹中,无论我是否以管理员身份运行,我都需要这样做:
Shortcut Location Start In Property Command Prompt Working Directory
-------------------- ------------------- ------------------------------------------
C:\Temp <undefined> D:\Temp\Utilities
C:\Data\bin C:\Data\bin C:\Data\bin
C:\Data\bin D:\Temp\Utilities D:\Temp\Utilities
这意味着我不能总是使用%~dp0 在我的批处理文件中设置工作目录。我需要的是批处理文件知道它是直接运行还是通过快捷方式运行的某种方式。如果批处理文件直接运行,那么工作目录很容易获得,它只是%cwd%的值。如果使用快捷方式运行批处理文件,我不知道如何在批处理文件中获取“开始”属性。
有谁知道如何在我的批处理文件中执行这两项操作:
1。检查它是直接运行还是通过快捷方式运行。
2。如果由快捷方式运行,请获取启动它的快捷方式的“开始”属性。
谢谢,
Orangu
更新
我找到了解决这个问题的“黑客”方式。对于快捷方式,我编辑了“目标”字段并将其更改为以下内容:
cmd.exe /k pushd "C:\Temp" && "D:\Temp\Utilities\batchfile.bat"
现在可以通过在批处理文件中调用%CD%来获取工作目录,这对管理员和普通用户都有效。但是,它不适用于直接运行批处理文件的情况。在这种情况下,我仍然需要使用%~dp0 。
我不喜欢这个解决方案,因为它需要我手动更改我制作的所有快捷方式,这也使得图标看起来像是cmd提示图标而不是批处理文件。
答案 0 :(得分:0)
您是否考虑过根本不使用快捷方式?
你可以,例如创建一个包含您的电话的batchfile_exec.bat
REM optionally do
REM cd /D working_directory
REM if you want to force a special working directory
D:\Temp\Utilities\batchfile.bat
并用batchfile_exec.bat
替换所有快捷方式。如果双击batchfile_exec.bat
,工作目录将包含batchfile_exec.bat
。
我个人不喜欢Windows快捷方式,因为它们很难在修订控制系统中处理。正如您还注意到的那样,如果您想要修改其中很多内容,则会非常耗时。
顺便说一句:如果batchfile.bat
被设计/编写为始终从它所在的目录运行,您可能还会考虑修改batchfile.bat
以强制执行该行为:
setlocal
cd /D %0\..
REM your original content
endlocal
在%0
中存储批处理文件的路径。
诀窍是假设%0
是一个目录,然后根据该目录更改一级。使用/D
时,驱动器号也会正确更改。
cd
命令并不关心%0
是否真的是一个目录。事实上,%d
甚至不存在(%0\dummy\..\..
也可以)。
setlocal
命令是在batchfile.bat
完成后恢复工作目录(如果从另一个批处理文件调用batchfile.bat
,这将是好的。)
我注意到endlocal
命令在此上下文中并不是必需的,因为batchfile.bat
完成后会隐式应用它。