【问题标题】:Batch file - Current working directory interferes with environment variable CD批处理文件 - 当前工作目录干扰环境变量 CD
【发布时间】:2021-12-02 02:12:26
【问题描述】:

在我的 Windows 笔记本电脑上,我的公司将环境变量 CD 设置为某个目录,我无法更改它。在批处理文件中,我必须使用当前的工作目录,例如

set current_dir=%cd%

现在环境覆盖当前目录。如果我把这条线

set cd=

前面的原始变量将被删除。由于批处理文件也可能在其他环境中使用,有没有一种安全的方法来获取当前目录?

【问题讨论】:

  • %cd% 是一个系统变量。不要碰它。
  • 我的公司设置了变量并且 Windows 允许它。这就是我要求安全解决方案的原因。
  • Echo(%__CD__% 和/或Echo(%__CD__:~,-1% 的输出是什么?
  • 你必须告诉你的公司 %cd% 变量永远不能被设置并且他们应该改变他们的批处理文件。如果您设置了%time% 变量,您将无法获取时间,尽管在这种情况下可以通过其他方式检索它。如果您设置了%errorlevel% 变量,您可以以任何其他方式获取此值...换句话说:动态系统变量必须设置。你不能设置它然后寻找这个问题的补丁/解决方案... :( 无论如何,这是一个可能的解决方案:( set "cd=" & set "current_dir=!cd!" & set "cd=%cd%" )
  • @RaphaelM。我看到你是新来的......我已经为你的问题提供了解决方案。如果您没有编辑 Windows 注册表的管理权限,您仍然可以手动输入DOSKEY 或使用DOSKEY 创建批处理文件。无论哪种方式,它都会起作用,你会得到你的%CD%。但是,请考虑对答案进行投票并将其标记为已解决。这样做你会得到 2 分。 ;)

标签: windows batch-file environment-variables cwd


【解决方案1】:

根据我的评论,对于一般用途,我建议的第一件事是您使用%__CD__%(或者如果您不想要尾部反斜杠,%__CD__:~,-1%,而不是。

例子:

@Set "CWD=%__CD__:~,-1%"
@Set CWD 2>NUL
@Pause

以下替代方案也可能对您有所帮助,尽管没有一个在类似损坏的环境中进行过测试:

@Set "CWD="
@For %%G In (.) Do @Set "CWD=%%~fG"
@Set CWD 2>NUL
@Pause
@Set "CWD="
@For /F "Delims=" %%G In ('CD') Do @Set "CWD=%%G"
@Set CWD 2>NUL
@Pause
@Set "CWD="
@For /F "EOL=? Delims=" %%G In ('Echo Prompt $P^|%SystemRoot%\System32\cmd.exe /D/E')Do @Set "CWD=%%G"
@Set CWD 2>NUL
@Pause

【讨论】:

    【解决方案2】:

    将当前路径分配给变量的基本命令如下:

    Command line: FOR /f %p in ('CD') do SET myVar=%p
    Batch script: FOR /f %%p in ('CD') do SET myVar=%%p

    但您可以进一步编辑 Windows 注册表
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]\autoron
    每次打开 MSDOS 实例时插入以下宏:

    DOSKEY CHDIR=(IF [$1] == [] ( CD ) ELSE ( PUSHD $* )) & FOR /f %p in ('CD') do @SET cd=%p
    

    因此,覆盖CHDIR 命令以将当前路径设置为%cd% 变量或您想要的任何其他变量。还使用网络目录:D

    【讨论】:

    • doskey的方式比通过set cd=删除环境变量有什么好处?
    • 贵公司已重新定义了%CD% 变量,因此当您运行CD 命令时,它永远不会被再次覆盖。定义宏的好处是不需要在每次需要时都使用SET cd= 变量。只需自己运行CHDIR 宏,它就会为您更新变量。请注意CDCHDIR 的别名,我所做的是覆盖预先存在的CHDIR 命令,因此它不再尊重您的公司定义,并返回更新变量。如果你愿意,可以切换到CD
    • 正如我在问题中所说,我不想触及环境变量CD。这可能会对我的系统产生其他副作用,而且宏也太麻烦了。您答案的第一部分更多的是我正在寻找的内容,并且类似于@Compo 的解决方案。但是感谢您的努力!
    • ???只需更改将接收路径的变量的名称。我给了你世界上最好的解决方案,你却吐在盘子上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2013-06-08
    • 2014-01-08
    相关资源
    最近更新 更多