2015-02-10 116 views
1

昔日,我還記得我們曾經用它來作爲cmd文件的簡單調用運行Windows cmd.exe內Perl腳本,而不必爲腳本的名稱運行perl.exe一招,是這樣的:有沒有辦法讓一個可讀的SINGLE cmd/powershell腳本?

@rem = ' 
@perl -x -S %0 %* 
@goto :eof 
@rem '; 
<insert Perl script here> 

這使用了相當整潔的技巧來利用差異來處理輸入腳本,如何使用cmd.exeperl.exe。 Windows'cmd.exe會將前三行讀作三個單獨的命令:

  • 有沒有回聲的評論;
  • 用相同的輸入文件和參數運行perl,沒有echo;和
  • 轉到文件結束(退出)沒有回聲。

另一方面,perl.exe會將前四行作爲賦值語句,然後繼續執行正確的Perl腳本。

現在經常是要逃避cmd.exe命令行PowerShell腳本,因爲你必須使用像一個痛苦:

powershell -file go.ps1 

我不知道是否有這兩個批次編碼方式 PowerShell命令放入一個類似於Perl技巧的單個cmd文件,開始cmd.exe下運行,但在此之後很快切換到Powershell。在命令行

go 

,而不是powershell一些令人費解的調用:

如果這是可能的,你可以簡單地通過進入運行腳本go.cmd

我知道你可以運送單獨的cmdps1文件,但這實際上是我想擺脫的。如果可能,我正在尋找單個文件解決方案。

我也知道你可以base-64編碼你的腳本或者將它作爲一個字符串執行,只要你用分號替換所有換行符。但是這意味着Powershell的東西在結果文件中不再易於編輯或讀取。

+0

的【如何運行DOS批處理文件中的PowerShell腳本(http://stackoverflow.com/questions/2609985/how-to-run-a-powershell-script-within-a-dos-可能重複批處理文件) – 2015-02-24 04:25:18

+0

無賴。是的,這是一個明顯的欺騙,並且接受的答案顯然要優於我的答案。投票結束。 – 2015-02-24 07:52:25

回答

1

幸運的是,Powershell確切地知道如何處理.cmd文件:使用CMD運行它們。

@set $a=%0 && powershell -encodedcommand ZwBjACAAKAAoAGQAaQByACAAZQBuAHYAOgBgACQAYQApAC4AdgBhAGwAdQBlACAALQByAGUAcABsAGEAYwBlACAAJwAiACcALAAnACcAKQAgAHwAIABzAGUAbABlAGMAdAAgAC0AcwBrAGkAcAAgADIAIAB8ACAAcABvAHcAZQByAHMAaABlAGwAbAAgAC0A 
@exit /b 
"Hello from Powershell! You know it's me because cmd would never know that 2 + 2 = $(2 + 2)!" 

編碼命令

gc ((dir env:`$a).value -replace '\"','') | select -skip 2 | powershell - 

其中獲取腳本調用本身的內容,跳過用於CMD的東西,是的,運行PowerShell的就休息。

由於我們通過管道標準輸入的命令,而不是讓他們在適當的腳本文件可能有更復雜的腳本怪事,加倍所以如果你開始築巢這些雜種。在生產中我不會相信這一點,但是,嘿,這是某種東西。

相關問題