2017-08-04 91 views
1

我知道在這裏有關於此主題的其他問題,但沒有一個解決了我的情況。我有一個完整路徑規定的程序例子可能是:Powershell:將程序的完整路徑和參數傳遞給ScriptBlock

  • C:\ 「程序文件(x86)」 \的Lorem \ program1.exe
  • C:\ 「程序文件」 \存有\程序2 .EXE

如果我嘗試直接通過C:\"Program Files (x86)"\Lorem\program1.exe /S終端將沒有問題運行執行它,但如果我嘗試使用我的腳本將無法正常工作:

# $full_path contains the string for the path, e.g. C:\"Program Files (x86)"\supersoftware\uninst.exe 

Write-Host $full_path # Will print on the screen: C:\"Program Files (x86)"\Lorem\uninst.exe 
Invoke-Command -ComputerName localhost -ScriptBlock { cmd /c $full_path '"/S"' } # /S is used for silent uninstall 

我怎樣才能讓PS像我一樣執行它e在終端上輸入C:\"Program Files (x86)"\Lorem\uninst.exe /S並點擊進入?

+0

當使用包含空格的路徑名時,引用整個路徑名,而不僅僅是具有空格的部分。因此,您的程序應該被引用爲「」C:\ Program Files(x86)\ Lorem \ Program1.exe「」,而不是「C:\」Program Files(x86)「\ Lorem \ Program1.exe」 –

+0

好吧,我'把它作爲'C:\ ...''在外面引用而不在裏面。現在我收到一個新的錯誤:''/ S'未被識別爲內部或外部命令' – JChris

回答

2

因爲在不同的會話中調用腳本塊,默認情況下該變量不存在。您可以使用using範圍修改器來解決此問題。

Invoke-Command -ComputerName ServerName -ScriptBlock { cmd /c $using:full_path /S } 

請注意,該對象將被序列化爲遠程處理。這不會影響字符串,但複雜對象通常只包含原始屬性值。

+0

'調用命令-ComputerName localhost -ScriptBlock {開始 - 進程-FilePath「$($ using:full_path)」-ArgumentList 「/ s」}' – Manu

+0

如果它立即完成運行,很有可能它不會等待該過程完成。如果會話在流程結束之前關閉,流程將被終止。嘗試類似於'Start-Process -FilePath $ using:full_path -ArgumentList'/ S'-Wait'。 –

+0

它與'Invoke-Command -ComputerName ServerName -ScriptBlock {cmd/c $ using:full_path/S}'一起工作,我正在檢查錯誤的地方! – JChris

相關問題