Windows, PowerShell ve Uzun Yollar

Windows, PowerShell ve Uzun Yollar

Sanırım sen de benim gibi buna benzer yolları bir kereden fazla gördün !!! Önemli____Yeni____!!! 98819 Şubat 649 tarih ve 30-1985-B Sipariş No. Ivan Aleksandrovich Kozlov'un kurumsal VIP müşterileri desteklemek ve kenarda iş toplantıları düzenlemek için bölümün geçici başkan vekili olarak atanması hakkında.doc.

Ve çoğu zaman böyle bir belgeyi Windows'ta hemen açamazsınız. Bazı kişiler disk eşleme şeklinde geçici çözüm uygularken, diğerleri uzun yollarla çalışabilen dosya yöneticilerini kullanır: Far Manager, Total Commander ve benzerleri. Ve çok daha fazlası, yarattıkları, çok emek harcadıkları ve test ortamında müthiş bir şekilde çalışan PS senaryosunun üretim ortamında çaresizce imkansız bir görevden şikayet etmesini üzüntüyle izledi: Belirtilen yol, dosya adı veya her ikisi de çok uzun. Tam nitelikli dosya adı 260 karakterden ve dizin adı 248 karakterden kısa olmalıdır.
Görünüşe göre 260 karakter "sadece herkes için değil" yeterli. İzin verilen sınırların ötesine geçmek istiyorsanız lütfen kediye bakın.

Dosya yolu uzunluğunu sınırlamanın talihsiz sonuçlarından bazıları şunlardır:

Konudan biraz uzaklaşarak, DFS Çoğaltma için makalede tartışılan sorunun çok da kötü olmadığını ve uzun adlara sahip dosyaların sunucudan sunucuya başarıyla seyahat ettiğini (tabii ki diğer her şey yolundaysa) not ediyorum. Doğru yaptı).

Ayrıca bana birden fazla kez yardımcı olan çok faydalı bir yardımcı programa da dikkatinizi çekmek isterim. robocopy. Ayrıca uzun yollardan korkmuyor ve çok şey yapabiliyor. Bu nedenle, görev dosya verilerinin kopyalanması/aktarılmasıyla sınırlıysa burada durabilirsiniz. Dosya sistemi erişim kontrol listeleri (DACL'ler) ile oyun oynamanız gerekiyorsa, başka yere bakın subinacl. İlerlemiş yaşına rağmen Windows 2012 R2'de mükemmel performans gösterdi. Burada uygulama yöntemleri dikkate alınır.

Uzun PowerShell yollarıyla nasıl çalışılacağını öğretmek ilgimi çekiyordu. Onunla sanki Ivan Tsarevich ve Güzel Vasilisa hakkındaki sakallı bir şakadaki gibi.

Hızlı yolu

Linux'a geçin ve Windows 10/2016/2019 hakkında endişelenmeyin ve uygun grup ilkesi ayarını etkinleştirin/kayıt defterinde ince ayar yapın. Bu yöntem üzerinde ayrıntılı olarak durmayacağım çünkü... İnternette bu konuyla ilgili zaten birçok makale var, örneğin, bu.

Çoğu şirketin, en hafif deyimle işletim sistemlerinin en son sürümlerine değil, çok sayıda işletim sistemine sahip olduğu göz önüne alındığında, bu yöntem yalnızca kağıda yazmak için hızlıdır, tabii ki birkaç eski sisteme ve Windows 10'a sahip olan şanslılardan biri değilseniz /2016/2019 üstün hüküm sürüyor.

Uzun yol

Değişikliklerin Windows Explorer'ın davranışını etkilemeyeceğini ancak PowerShell cmdlet'lerinde Get-Item, Get-ChildItem, Remove-Item vb. gibi uzun yolların kullanılmasını mümkün kılacağını hemen burada ayırtalım.

Öncelikle PowerShell'i güncelleyelim. Bir, iki, üç kez yapıldı.

  1. .NET Framework'ü 4.5'ten daha düşük olmayan bir sürüme güncelliyoruz. İşletim sistemi en az Windows 7 SP1/2008 R2 olmalıdır. Güncel sürümü indirebilirsiniz burada, daha fazla bilgi okuyun burada.
  2. İndir ve Windows Management Framework 5.1'i yükleyin
  3. Makineyi yeniden başlatıyoruz.

Çalışkan insanlar yukarıda açıklanan adımları manuel olarak yapabilir, tembel insanlar bunu SCCM, politikalar, komut dosyaları ve diğer otomasyon araçlarının yardımıyla yapabilir.

PowerShell'in geçerli sürümü değişkenden bulunabilir. $PSVersionTable. Güncellemeden sonra şöyle görünmelidir:

Windows, PowerShell ve Uzun Yollar

Şimdi cmdlet'leri kullanırken Get-childItem ve her zamanki yerine benzerleri Yol kullanacağız değişmezYol.

Yol formatı biraz farklı olacaktır:

Get-ChildItem -LiteralPath "?C:Folder"
Get-ChildItem -LiteralPath "?UNCServerNameShare"
Get-ChildItem -LiteralPath "?UNC192.168.0.10Share"

Yolları normal formattan formata dönüştürme kolaylığı için değişmezYol bu işlevi kullanabilirsiniz:

Function ConvertTo-LiteralPath 
Param([parameter(Mandatory=$true, Position=0)][String]$Path)
    If ($Path.Substring(0,2) -eq "") {Return ("?UNC" + $Path.Remove(0,1))}
    Else {Return "?$Path"}
}

Parametreyi ayarlarken lütfen unutmayın değişmezYol Joker karakter kullanamazsınız (*, ? vb.)

Parametreye ek olarak değişmezYol, PowerShell cmdlet'inin güncellenmiş sürümünde Get-childItem parametreyi aldım derinlikÖzyinelemeli arama için yuvalama derinliğini ayarlayabileceğiniz, birkaç kez kullandım ve memnun kaldım.

Artık PS betiğinizin uzun dikenli yolda kaybolacağından ve uzaktaki dosyaları göremeyeceğinden endişelenmenize gerek yok. Örneğin, DFSR klasörlerindeki dosyaların "geçici" özelliğini sıfırlamak için bir komut dosyası yazarken bu yaklaşım bana çok yardımcı oldu. Ama bu başka bir hikaye, bunu başka bir makalede anlatmaya çalışacağım. Sizden ilginç yorumlarınızı bekliyorum ve ankete katılmanızı öneriyorum.

Yararlı linkler:
docs.microsoft.com/ru-ru/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1
stackoverflow.com/questions/46308030/handling-path-too-long-istisna-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

Uzun yollar sorunu sizi ilgilendiriyor mu?

  • Evet

  • İlgiliydi, ancak zaten karar verildi

  • Engelliyor ama fazla değil

  • Bunu düşünmedim, her şey çalışıyor gibi görünüyor

  • Hayır

  • Diğer (lütfen yorumda belirtin)

155 kullanıcı oy kullandı. 25 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle