2017-05-28 16 views
3

のは、これが私のWindowsシステムのPATHがどのように見えるかであるとしましょう:削除行変数

C:11.2.0 \ 32ビット\ client_1の\ビン\ \オラクル\製品を、C:\オラクル\製品\ 11.2.0 \ 64 \のclient_1の\ビン; 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は(一般的に)抽象度の高いレベルで動作するため、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_ '' 'として解釈する' \ ''を扱うことはできません。この問題を回避するには、あなたの答えのためにしたばかりの(画面外の)コメントに "missing"の ''を付けることです。 – mklement0

+0

ありがとう、しかし、私の携帯電話には# 'が見える。それはモバイルデバイス上でのポスト表現の失敗のようです。 – k7s5a

+0

私に知らせてくれてありがとう - それは不完全な回避策です。水平スクロールを使用してコメントをデスクトップサイトに表示することもできますが、少なくともコードは問題ありません。 – mklement0