Может ли PowerShell 1.0 создавать жесткие и мягкие ссылки, аналогичные разнообразию Unix?
Если это не встроено, может ли кто-нибудь указать мне на сайт с ps1 script, который имитирует это?
Это необходимая функция любой хорошей оболочки, ИМХО.:)
Может ли PowerShell 1.0 создавать жесткие и мягкие ссылки, аналогичные разнообразию Unix?
Если это не встроено, может ли кто-нибудь указать мне на сайт с ps1 script, который имитирует это?
Это необходимая функция любой хорошей оболочки, ИМХО.:)
Вы можете вызвать mklink
, предоставленный cmd
, из PowerShell для создания символических ссылок:
cmd /c mklink c:\path\to\symlink c:\target\file
Вы должны передать /d
mklink
, если целью является каталог.
cmd /c mklink /d c:\path\to\symlink c:\target\directory
Для жестких ссылок я предлагаю что-то вроде Sysinternals Junction.
Windows 10 (и Powershell 5.0 в целом) позволяет создавать символические ссылки с помощью командлета New-Item.
Использование:
New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir
Или в вашем профиле:
function make-link ($target, $link) {
New-Item -Path $link -ItemType SymbolicLink -Value $target
}
Включите режим разработчика, чтобы не требовать прав администратора при создании ссылок с New-Item
:
Нет, он не встроен в PowerShell. И утилита mklink
не может быть вызвана сама по себе в Windows Vista/Windows 7, потому что она встроена непосредственно в cmd.exe
как "внутренняя команда".
Вы можете использовать Расширения сообщества PowerShell (бесплатно). Существует несколько командлетов для точек повторного анализа различных типов:
New-HardLink
,New-SymLink
,New-Junction
,Remove-ReparsePoint
В Windows 7 команда
fsutil hardlink create new-file existing-file
PowerShell находит его без полного пути (c:\Windows\system32) или расширения (.exe).
New-Symlink:
Function New-SymLink ($link, $target)
{
if (test-path -pathtype container $target)
{
$command = "cmd /c mklink /d"
}
else
{
$command = "cmd /c mklink"
}
invoke-expression "$command $link $target"
}
Remove-Symlink:
Function Remove-SymLink ($link)
{
if (test-path -pathtype container $link)
{
$command = "cmd /c rmdir"
}
else
{
$command = "cmd /c del"
}
invoke-expression "$command $link"
}
Использование:
New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
Утилита командной строки Junction от SysInternals упрощает создание и удаление соединений.
Вы можете использовать эту утилиту:
c:\Windows\system32\fsutil.exe create hardlink
Я написал модуль PowerShell, который имеет встроенные оболочки для MKLINK. https://gist.github.com/2891103
Включает функции для:
Захват вывода MKLINK и, при необходимости, генерирует правильные ошибки PowerShell.
Я объединил два ответа (@bviktor и @jocassid). Он был протестирован в Windows 10 и Windows Server 2012.
function New-SymLink ($link, $target)
{
if ($PSVersionTable.PSVersion.Major -ge 5)
{
New-Item -Path $link -ItemType SymbolicLink -Value $target
}
else
{
$command = "cmd /c mklink /d"
invoke-expression "$command ""$link"" ""$target"""
}
}
Собственно, команда Sysinternals junction
работает только с каталогами (не спрашивайте меня почему), поэтому она не может жестко привязать файлы. Я бы пошел с cmd /c mklink
для мягких ссылок (я не могу понять, почему он не поддерживается напрямую PowerShell) или fsutil
для жестких ссылок.
Если вам это нужно для работы с Windows XP, я не знаю ничего, кроме Sysinternals junction
, поэтому вы можете ограничить каталоги.
Я нашел это простым способом без внешней помощи. Да, он использует архаичную команду DOS, но она работает, это легко, и это понятно.
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
$_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
Это использует команду dOS dir для поиска всех записей с атрибутом символической ссылки, фильтров по определенному имени ссылки, за которыми следуют целевые "[]" скобки, а для каждого - предположительно один - извлекает только целевую строку.