2017-05-28 68 views
3

比方說,這是我的Windows系統路徑是什麼樣子:刪除線

C:\ ORACLE \產品\ 11.2.0 \ 32位\ client_1與\ BIN; C:\ ORACLE \產品\ 11.2.0 \ 64bit \ client_1 \ bin; C:\ WINDOWS \ system32; C:\ WINDOWS; C:\ WINDOWS \ System32 \ Wbem; C:\ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \

我將如何刪除第一個條目並將其添加到列表的末尾?我知道你可以爲此使用setx,但我寧願使用PowerShell來做到這一點。

+0

你知道持有PowerShell中的路徑字符串變量的名字嗎?爲什麼不做一個循環來獲取字符串的每個字符並將其複製到$ buffer1,直到它到達第一個'「;」'。之後,停止將字符複製到$ buffer1並開始將它們複製到$ buffer2(也就是$ buffer2 + = $ char)。完成循環後,只需將PATH設置爲$ buffer2 + $ buffer1 – flen

回答

5
# Split the existing path into the 1st entry and the rest. 
$first, $rest = $env:Path -split ';' 

# Rebuild the path with the first entry appended. 
$env:Path = ($rest + $first) -join ';' 

# To make this change persistent for the current user, 
# an extra step is needed: 
[Environment]::SetEnvironmentVariable('Path', $env:Path, 'User') 
+0

謝謝,這就是我一直在尋找的!我已經看到了一些使用-split命令的其他例子,但並不確定這是否是最好的解決方案或如何應用它。 – Chris

+0

@Chris;我的榮幸; '-split','-join'和'-replace'是強大的野獸 - 非常值得在PowerShell中瞭解它們。 – mklement0

-1

我對PowerShell腳本不太熟悉,但我相信你可以在其中編寫普通的C#。如果是這樣,那麼C#可能會有所幫助。

請注意,有三個PATH環境變量可供選擇:給予進程的環境變量,給予用戶的環境變量和給予機器自身的環境變量。對於下面的演示代碼,我選擇了這個過程。

var whichPath = EnvironmentVariableTarget.Process; 

string path = Environment.GetEnvironmentVariable("PATH", whichPath); 

string [] pathEntries = path.Split(';'); 

if (pathEntries.Length > 1) 
{ 
    // Initialize to the necessary length, for efficiency. 
    var sb = new StringBuilder(capacity: path.Length); 
    for(int i = 1; i < pathEntries.Length; ++i) 
    { 
     sb.Append(pathEntries[i]).Append(';'); 
    } 
    sb.Append(pathEntries[0]).Append(';'); 

    Environment.SetEnvironmentVariable("PATH", sb.ToString(), target: whichPath); 
} 
+1

是的,有方法可以在PowerShell中按需編譯C#代碼(請參見[Add-Type](https://msdn.microsoft.com/en-us /powershell/reference/5.1/microsoft.powershell.utility/add-type)),但要做的主要原因是性能(對於_repeated_任務,因爲您在初始編譯時確實付出了性能損失)。 鑑於PowerShell可以更簡潔地完成這項工作,因爲它(通常)在更高的抽象級別上運行,所以手頭的案例絕對不會爲C#使用調用。 – mklement0

0

一個快速和簡單的方法:

$values = 'C:\oracle\product\11.2.0\32bit\client_1\bin;C:\oracle\product\11.2.0\64bit\client_1\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WIN DOWS\System32\WindowsPowerShell\v1.0\' -split ';'         #' 

$result = $values[$values.Count-1] + ';' 
for($i = 1; $i -lt $values.Count-1; $i++){ $result += $values[$i] + ';' } 
$result += $values[0] 

$result 
+0

謝謝。不幸的是,熒光筆無法處理'\'',它將其解釋爲_escaped_'''。解決方法是在(屏幕外)註釋中提供「缺失」關閉''',這是我剛剛爲您的答案所做的。 – mklement0

+0

謝謝,但在我的手機上有#'可見。這似乎是移動設備上發佈後的失敗。 – k7s5a

+0

感謝您告訴我 - 這是一個不完美的解決方法;你也可以在桌面網站上使用水平滾動來使註釋可見,但至少它不會造成任何傷害(代碼仍然有效)。 – mklement0