8

我正在创建一个标准的 Windows BAT/CMD 文件,并且我想创建一个 IF 语句来检查这个 CMD 文件是否是从 PowerShell 运行的。我怎样才能做到这一点?

编辑:我的根本问题是test.cmd "A=B"导致%1==A=B从 CMD运行但从 PowerShell 运行时%1==A%2==B在这两种情况下,脚本本身实际上都是作为旧的 Windows 命令行脚本运行的,因此检查 Get-ChildItem 总是会产生错误。

4

3 回答 3

5

一种方法是查看您的进程名称,然后检查其属性:

title=test
tasklist /v /fo csv | findstr /i "test"

只要您使用唯一的名称代替 Test,就应该几乎没有出错的余地。

你会得到类似的东西:

"cmd.exe","15144","控制台","1","3,284 K","正在运行","GNCID6101\Athomsfere","0:00:00","test"

当我从 bat 文件运行上述代码时,我的输出是:

"powershell.exe","7396","控制台","1","50,972 K","正在运行","GNCID6101\Athomsfere","0:00:00","

于 2013-05-04T16:21:53.910 回答
2

一种可能对您有用的可能更简单的方法。如果没有,它可能适合其他人。

  1. 创建 2 个单独的脚本文件:test.ps1test.cmd
  2. 调用脚本时不要包含扩展名。即调用为<path>\test(或者只是test如果文件夹在路径环境变量中。
  3. 这是有效的,因为 CMD 优先考虑执行哪个脚本:.bat > .cmd,而 Powershell 优先考虑:.ps1 > .bat > .cmd

以下是 CMD 会话的输出:

C:\Temp>copy con test.cmd
@echo cmd^Z
        已复制 1 个文件。

C:\Temp>copy con test.ps1
写输出“ps1”^Z
        已复制 1 个文件。

C:\温度>.\测试
命令

C:\温度>

test并从 Powershell调用:

PS C:\Temp> .\test
ps1
PS C:\温度>
于 2017-10-25T02:38:02.773 回答
0

您不能尝试执行 Get-ChildItem 然后检查 %ERRORLEVEL% 以查看它是否返回未找到的 exe?

http://ss64.com/nt/errorlevel.html

于 2013-05-04T13:33:33.420 回答