我正在创建一个标准的Windows BAT/CMD文件,我想做一个IF语句来检查这个CMD文件是否从PowerShell运行。我怎样才能做到这一点?如何从命令行检测我是否处于PowerShell中?
编辑:我的根本问题是,test.cmd "A=B"
导致%1==A=B
从CMD运行,但%1==A
和%2==B
从PowerShell中运行时的时候。在这两种情况下,脚本实际上都是作为旧的Windows命令行脚本运行的,因此检查Get-ChildItem总是会产生错误。
我正在创建一个标准的Windows BAT/CMD文件,我想做一个IF语句来检查这个CMD文件是否从PowerShell运行。我怎样才能做到这一点?如何从命令行检测我是否处于PowerShell中?
编辑:我的根本问题是,test.cmd "A=B"
导致%1==A=B
从CMD运行,但%1==A
和%2==B
从PowerShell中运行时的时候。在这两种情况下,脚本实际上都是作为旧的Windows命令行脚本运行的,因此检查Get-ChildItem总是会产生错误。
的一种方法,它看你的进程名是什么,然后检查其属性:只要你使用的地方测试的唯一名称
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 “,”
难道你不能尝试执行一个Get-ChildItem,然后检查%ERRORLEVEL%,看看它是否返回一个未找到的exe文件?
请参阅编辑...我想我误解了这个问题并提出了错误的问题,因此您的解决方案将不起作用 – Nilzor 2013-05-04 15:42:30
一个可能更简单的方法,可能适合你。否则,它可能适合其他人。
test.ps1
和test.cmd
<path>\test
(或只是test
如果文件夹是在PATH环境变量.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>
我不认为有一个简单的方法,除非你看看哪个进程启动了cmd.exe,即使那样你也不会捕获所有的PowerShell运行时。也许如果你能解释你的目标是什么,我们可以提出另一种解决问题的方法。 – 2013-05-04 12:24:58
你是对的。请参阅更新 – Nilzor 2013-05-04 15:43:04
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