2013-05-04 59 views
5

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

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

+1

我不认为有一个简单的方法,除非你看看哪个进程启动了cmd.exe,即使那样你也不会捕获所有的PowerShell运行时。也许如果你能解释你的目标是什么,我们可以提出另一种解决问题的方法。 – 2013-05-04 12:24:58

+0

你是对的。请参阅更新 – Nilzor 2013-05-04 15:43:04

+2

http:// stackoverflow。com/questions/4940375/how-do-i-pass-an-equal-sign-when-calling-a-batch-script-in-powershell解释如何解决该问题 – 2013-05-04 16:10:28

回答

5

的一种方法,它看你的进程名是什么,然后检查其属性:只要你使用的地方测试的唯一名称

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

,应该有错误的空间很小。

你会得到这样的:

“cmd.exe的”, “15144”, “控制台”, “1”, “3,284 K”, “暗战”, “GNCID6101 \ Athomsfere” “0:00:00”, “测试”

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

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

+0

除了我发现,当您运行一个来自PowerShell的.CMD文件,它确实将其作为“旧”命令行脚本运行。 title = test然后是一个有效的命令。这两个命令都不会在shell中产生错误 – Nilzor 2013-05-04 16:32:39

+0

你是对的!看我的编辑。 – 2013-05-04 16:36:29

+0

好吧,你的意思是如果我找“powershell”并找到它,我知道我在Powershell?我想我可以做到这一点,通过使用grep的Windows或东西,除非你有一个更简单的解决方案 – Nilzor 2013-05-04 16:40:12

0

难道你不能尝试执行一个Get-ChildItem,然后检查%ERRORLEVEL%,看看它是否返回一个未找到的exe文件?

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

+0

请参阅编辑...我想我误解了这个问题并提出了错误的问题,因此您的解决方案将不起作用 – Nilzor 2013-05-04 15:42:30

0

一个可能更简单的方法,可能适合你。否则,它可能适合其他人。

  1. 创建2个独立的脚本文件:test.ps1test.cmd
  2. 调用脚本的时候不包括扩展名。即调用为<path>\test(或只是test如果文件夹是在PATH环境变量
  3. 这工作,因为CMD优先考虑为执行该脚本:.bat > .cmd,而PowerShell的优先考虑:.ps1 > .bat > .cmd

以下是输出一个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> 

,并呼吁test从Powershell的:

 
PS C:\Temp> .\test 
ps1 
PS C:\Temp> 
相关问题