2015-10-21 117 views
0

我有問題需要通過PowerShell在遠程服務器上執行批處理文件。用戶可以選擇在彈出窗口中的若干意見一樣服務器名開始殺死過程和SERVICENAME。所選項目將保存在變量中。使用路徑中的空格執行批處理文件

如果選擇了所有項目,我想將這些字符串合併到一個字符串中並執行命名爲此結果字符串的批處理腳本。 我嘗試按照this post中的描述進行操作,但批處理腳本不會執行。

實施例:

[String]$scriptpath="C:\tmp\" 
[String]$Servername = "xx040" 
[String]$actionprefix = "kill_process" 
[String]$action = $($actionprefix) + "-" 
[String]$Servicename = "service1" 
[String]$ServiceFullname = $($action) + $($Servicename) + ".bat" 
$batchPath = $("`"$scriptpath + $ServiceFullname `"") 
Invoke-Command -ComputerName $Servername -ScriptBlock { 
    cmd.exe /c "`"$batchPath`"" 
} 

回答

0

一種替代方案,以避免與在他們空格的路徑是使用8.3短符號。

在Windows中打開命令行並使用dir的/x參數。要找到程序文件的簡稱,請使用dir C:\prog* /x。這是結果:

21.10.2015 14:46 <DIR>   PROGRA~1  Program Files 
21.10.2015 12:47 <DIR>   PROGRA~2  Program Files (x86) 
04.09.2014 18:25 <DIR>   PR6AFF~1  Programs16Bit 

如果你要解決C:\Program Files你可以寫C:\PROGRA~1了。

+0

好知道未來,謝謝! – eduardw

+1

我不認爲這是一個好主意,因爲創建'8dot3' NTFS文件名可能被禁用(每卷或甚至每個系統)。請參閱'fsutil.exe行爲設置Disable8dot3 /?'和[禁用短文件名創建](http://www.itnotes.eu/?p=2322)。有些管理員這樣做是因爲他們認爲[禁用8.3文件名創建會提高Windows下的文件性能](https://support.microsoft.com/zh-cn/kb/121007),因此,出於性能原因,他們會在文件上禁用它服務器。 – JosefZ

+0

@JosefZ我會說「這取決於」;-)我們只能希望,從來沒有一個「無聊的管理員」設置DisableCMD = 1'(請參閱https://technet.microsoft.com/en-us/library/ cc787344(v = ws.10)的.aspx)。 – Marged

1

在你的代碼中,你沒有傳遞任何東西給你的invoke-command,所以當它遠程運行時它不知道什麼是$batchPath。看看這個SO回答How do I pass named parameters with Invoke-Command?

Invoke-Command -ComputerName $Servername -ScriptBlock {param($batchPath) cmd.exe /c "`"$batchPath`"" } -ArgumentList $batchPath 

你是如何打電話給你的。

+0

你是對的!現在批處理腳本已成功運行。我在代碼中發現了一個錯誤:將$ batchPath = $(「'」$ scriptpath + $ ServiceFullname''「)更改爲$ batchPath = $(」'「$ scriptpath \ $ ServiceFullname''」) – eduardw

1

只需使用call operator&)並將變量與批處理文件的路徑放在雙引號中。

& "$batchPath" 

您還需要使變量$batchPath通過using:範圍修改你的腳本塊內已知的,否則$batchPath的腳本塊內會比$batchPath的腳本塊之外的不同(空)變量。

Invoke-Command -Computer $Servername -ScriptBlock { 
    & "$using:batchPath" 
} 

另一種方法是給變量傳遞到腳本塊作爲參數:

Invoke-Command -Computer $Servername -ScriptBlock { 
    Param($BatchPath) 
    & "$BatchPath" 
} -ArgumentList $batchPath 

使用Join-Path建設的路徑,所以你不需要處理前/後路徑分隔符自己。此外,PowerShell使用雙引號字符串擴展變量,從而避免過多的連接。在單引號字符串中,變量不會被擴展,所以我通常對帶有字符串的引號使用雙引號,對於沒有變量的字符串使用單引號。

修改後的代碼:

$Servername = 'xx040' 
$scriptpath = 'C:\tmp' 
$actionprefix = 'kill_process' 
$Servicename = 'service1' 

$batchPath = Join-Path $scriptpath "$actionprefix-$Servicename.bat" 

Invoke-Command -ComputerName $Servername -ScriptBlock { 
    & "$using:batchPath" 
} 
相關問題