我需要在.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。
答案 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
)。