如何从命令行检测我是否在PowerShell中?

时间:2013-05-04 09:48:12

标签: powershell command-line cmd

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

你会得到类似的东西:

  

“cmd.exe的”, “15144”, “控制台”, “1”,“3284   K”, “运行”, “GNCID6101 \ Athomsfere”, “0:00:00”, “测试”

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

  

“powershell.exe”, “7396”, “控制台”, “1”,“50972   K “ ”运行“, ”GNCID6101 \ Athomsfere“, ”0:00:00“,”

答案 1 :(得分:2)

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

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

    C:\Temp>copy con test.cmd
    @echo cmd^Z
            1 file(s) copied.
    
    C:\Temp>copy con test.ps1
    Write-Output "ps1"^Z
            1 file(s) copied.
    
    C:\Temp>.\test
    cmd
    
    C:\Temp>
    

    从Powershell致电test

    PS C:\Temp> .\test
    ps1
    PS C:\Temp>
    

答案 2 :(得分:0)

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

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