Gists

Windows

Windows

操作系统

硬链接、软链接、符号链接

🔗 硬链接使得一个一个文件有多个访问入口。当所有入口被删除时,文件才真正被删除。

👍:兼容性好、不受盘符影响
👎:不支持文件夹、只支持本地驱动器的相同分区

🔗 软链接(如 Junction)将对文件夹进行重定向。类似于环境变量,外部程序并不会知道自己在处理一个软链接。

👍:兼容性不错、支持文件夹和文件(Junction 支持文件夹)、支持跨分区
👎:不支持相对路径、受盘符影响、某些系统的核心文件夹不支持软链接

🔗 符号链接是软链接的升级版。

👍:支持任意路径,甚至是不存在的路径
👎:兼容性较差、需要管理员权限

如何获得链接的真实地址?

dir <parentPath> | format-table | findstr <childPath>

环境变量

《怎样才能直接运行环境变量Path中目录的子目录中的程序》

怎么样在 cmd 中直接访问某文件夹及其子文件夹下所有程序呢?当然是把它们添加到环境变量里面啦~

文中有一段简单的 cmd 脚本用来递归查找文件夹下所有目录,这之后可以把这些目录添加的 Path 中,这样,目录下的程序就可以直接访问了。

自动设置环境变量脚本:我的需求和文章描述的不太一样。首先我在 OneDrive 里有一个 Code 的文件夹,装了诸如 Python2、Python3、NodeJS 等许许多多的依赖文件,我想通过脚本一次性全部将他们加入 CodeBin 变量下。以下是我的代码,十分简陋,仅供参考思路。

C:\Users\lionad\OneDrive\Code

首先,在“文档\WindowsPowerShell”目录下新建“Custom\Set-Env.ps1”脚本,写好设置环境变量的函数。

param(
  $name = $(throw '全局变量键名必填'),
  $path = $(throw '路径必填'),
  # 是否覆盖源键值对
  $overwrite = $False
)

"name=$name"
"path=$path"
"overwrite=$overwrite"

# 获取所有子文件夹
$values = if (test-path $path) {
  Get-ChildItem $path | 
    Where-Object { $_.getType().name -ne 'FileInfo' } | 
    ForEach-Object { $_.FullName }
} else {
  $path
}

# 是否合并原有数据
$old = [environment]::GetEnvironmentVariable($name, 'Machine')
$val = If ($overwrite) { $values -join ';' } Else { $old + ($values -join ';') }

# 去除重复
$washed = ($val.split(';') | Sort-Object -unique) -join ';'

Write-Output ("[Set-Env] " + $washed)

# 设置环境变量
[environment]::SetEnvironmentVariable($name, $washed, 'Machine')

然后,修改“文档\WindowsPowerShell\Microsoft.PowerShell_profile.ps1”文件。这个文件会在打开 PowerShell 时自动执行,我把它理解为用户的全局配置。

# 执行脚本并等待结果
function Execution ($scripts = @()) {
  $jobs = @()
  foreach ($script in $scripts) {
    $jobs += Start-Job -FilePath $script.path -ArgumentList $script.args
  }
  Wait-Job $jobs
  foreach ($job in $jobs) {
    " "
    "*" * 60
    " "
    "Receive Job Script output:"
    Receive-Job $job
  }
}

# 设置环境变量
function Set-Env (
  [String]$name = $(throw "Args Error, env keyname should be an String"),
  [String]$value= $(throw "Args Error, path should be an String"),
  [Boolean]$overwrite = $False
) {
  $customdir = Join-Path -Path $profiledir -ChildPath 'Custom/'
  $script = @{
    path = (Join-Path -Path $customdir -ChildPath 'Set-Env.ps1');
    args = @($name,$value,$overwrite)
  }
  Execution($script)
}

这之后,保存并重启 PowerShell,就可以愉快的调用 set-env 函数了。

测试一下我们的脚本能不能跑通。

set-env "test" "C:\\Users\\18062\\OneDrive\\WebSaver"

脚本返回了内容,再查看一下环境变量,也没啥问题~

test

防止单个环境变量过于臃肿:我没记错的话,单个环境变量的值长度是有限的,很容易就超过了。所以一半不会直接把一段常常的文本记录到 Path 变量下,而是在 Path 下再引用一个新的环境变量。

我在 Path 变量下引用了 CodeBin 变量:

Path

在 CodeBin 变量里面塞满其它路径,不至于撑爆 Path 变量:

CodeBin


Copyright © 2024 Lionad - CC-BY-NC-CD-4.0