2016-03-14 137 views
2

我很努力地使用PS腳本中的Psexec來執行交互式程序。 我已經試過這樣:PSExec和Powershell無法運行位於Program Files(x86)中的程序

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell notepad" 2> $null 

...,它運行完美的罰款。記事本在遠程機器上啓動。現在,當我想從Program Files(x86)運行.exe時,我一無所獲。 我已經試過這個變化運行的1.exe位於PROGRAMFILES(X86):

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell "${env:ProgramFiles(x86)}\1.exe"" 2> $null 

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell "${env:ProgramFiles(x86)}" + "\1.exe"" 2> $null 

但他們沒有工作。任何想法有什麼不對?

回答

3

嘗試以下操作:

psexec cmd /c 'echo . | powershell "& \"${env:ProgramFiles(x86)}\1.exe\"' 2>$null 

注:爲了更好地專注於解決方案的基礎,我已經簡化了psexec命令,但原命令應該工作了。

  • 傳遞給cmd /k整個字符串是 -quoted以防止內插元件前面PS,特別是其${env:ProgramFiles(x86)}膨脹,直到該命令是目標機器上執行應推遲。

    • 注意從cmd.exe本身調用時,你通常需要一個雙引號字符串時,您有一個命令行傳遞給cmd /c。在PowerShell中,然而,這是不是一個要求:PowerShell的第一解析字符串 - 無論是單或雙引號的原 - 內插(如果適用),然後經過導致雙引號到外部命令。
  • 注意& \"...\"構建體在powershell參數,從而確保正確執行與嵌入空格的路徑的情況下。

    • 奇怪的是,PS需要"字符。當參數通過從外部世界(而不是在PS領域內轉義爲`")轉義爲\"

    • 傳遞給powershell整體必須在命令雙引號,因爲cmd.exe - 在其上下文powershell調用由於cmd /c - 只能識別雙引號作爲參數分隔符,只有雙引號保護封閉內容(主要)來自口譯。


爲什麼你的命令,沒有工作:

  • 的主要問題是,你想powershell.exe可執行文件路徑來調用結束了含空間C:\Program Files...),導致PowerShell無法將整個路徑識別爲單個參數。這樣的路徑必須是(a)引用和(b)調用運營商&
    (在第二次嘗試中,使用+ ...(字符串連接),您也必須使用&,並在(...)中包含並置)。

    • 對於調試,使用cmd /k代替cmd /c可以給你如何命令最終執行感更好(/k保持命令執行後打開控制檯窗口)。
  • 甲微妙的一點是,通過使用雙引號整體串,${env:ProgramFiles(x86)}是在機器上,而不是目標機,其中,該環境變量的定義可以是或上展開可能不一樣。

+0

這簡直太棒了。應該如何做的很好的分解。謝謝@ mklement0。我必須刪除ProgramFiles和(x86)之間的空間才能使其正常工作,但除此之外,您的評論完美無瑕。 – Okrx

+0

@Okrx:我的榮幸;聽到那個消息很開心。無關的空間:爲我在32位機器上僞裝變量提供了正確的...感謝您的反饋;我已經解決了答案。 – mklement0

3

通過混合使用PowerShell,CMD和PsExec,您將自己置身於Escape Hell中。如果你想要的是運行在遠程主機上的可執行文件,只要堅持用CMD和PSEXEC(運行從CMD命令太):

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c echo. ^| "%ProgramFiles(x86)%\1.exe" 2>nul 

這樣,你只需要逃避管(^|),並把帶雙引號空格的路徑。

+0

儘管這肯定簡化了調用,但請注意OP如何提到「努力使用PS腳本中的Psexec _inside」(重點介紹)。 – mklement0

+1

這個命令工作得很好,我非常感謝您的幫助,但是這需要從PS腳本運行。 – Okrx

相關問題