2013-05-04 61 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> 
相關問題