如何使用独立于Shell的Windows环境变量?

时间:2015-09-22 21:07:23

标签: powershell batch-file cmd

我需要在.bat文件中更改为某个环境变量引用的目录。这些方面的东西:

cd %TMP%

这可以从Windows CMD shell中正常工作。但是,如果我尝试在Powershell终端窗口中运行bat,看起来该命令根本不起作用。但这确实如此:

cd $Env:TMP

因此,我试图弄清楚如何将内容保存到一个.bat文件中,但仍然允许用户在 CMD 提示和 PS下运行它提示。我可以想一些hacky方法来检查我是否在 CMD (而不是 PS )下,但我想知道是否有& #39;更好的解决方案。

我注意到的一件事是PROMPT环境变量与 CMD 一起出现但不与 Powershell 一起出现但是,正如我所说,这似乎有点hacky并且可能容易出错。

我没有试图填写我的代表,所以如果已经被问及回答,请指出我。我只是想找到一些不那么讨厌的东西,而不是试图找出bat正在运行的shell,并更改cd命令以适应它。

顺便说一句,因为它可能有所作为,我在 Powershell 4 下运行。我可能会使用.cmd文件,如果这会有任何区别,但如果有的话,我会感到惊讶。

修改

我想也许我并不是那么清楚。我试图找出是否有办法获得一个环境变量的值,该变量将在.bat文件中起作用,无论.bat文件是否在cmd shell下运行,该文件都能正常工作或者powershell shell。

1 个答案:

答案 0 :(得分:3)

从PowerShell运行批处理文件可以正常工作。但是,由于批处理文件在不同的解释器中运行(运行.\your.bat与运行cmd /c .\your.bat基本相同),因此通过(CMD)子项中的cd %TMP%更改工作目录进程不会更改(PowerShell)进程的工作目录。

批处理文件中用于变量的语法始终为%variable%

演示:

PS C:\> $PWD.Path
C:\
PS C:\> Get-Content .\test.bat
@echo off
echo before: %CD%
cd %TMP%
echo after:  %CD%
PS C:\> .\test.bat
before: C:\
after:  C:\Users\me\AppData\Local\Temp
PS C:\> $PWD.Path
C:\

批处理文件在将工作目录更改为%CD%之前和之后回显当前工作目录(%TMP%)的路径。父进程(PowerShell)的工作目录保持不变($PWD.Path)。