2017-05-28 65 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