Dizin adı toplu olarak çok uzun


4

Soruyu yığın taşması halinde zaten sordum ancak kimseden cevap alamadım. Bu yüzden burada da aynı soruyu soruyorum.

Bir toplu iş komut dosyası kullanarak belirtilen konumda veya geçerli konumda bulunan tüm klasörlerin boyutunu hesaplayacak bir program yapmaya çalışıyorum ve bir .csv dosyasına yazıyorum

Bu soruyu stackoverflow'ta izledim

https://stackoverflow.com/questions/21711180/how-to-list-all-folder-with-size-via-batch-file

ve benim kodum

`@echo off
 setlocal disabledelayedexpansion
 set "folder=%~1"
 Set "Value=0"
 if not defined folder set "folder=%cd%"
  (for /d %%a in ("%folder%\*") do (
    set "size=0"
    for /f "tokens=3,5" %%b in ('dir /-c /a /w /s /x "%%~fa\*" ^| findstr /b /c:"  "')do if "%%~c"=="" set "size=%%~b"
   setlocal enabledelayedexpansion
   echo(%%~nxa , !size!
   endlocal
  ))>>foldersize.csv 
endlocal
exit /b`

Kodu çalıştırdığımda hata alıyorum

"Dir_name" dizin adı çok uzun

Windows yolu adının maksimum uzunluğunun 260 karakter olduğunu ve bu hatanın nedeni olabileceğini zaten biliyordum.

Bu sorunu çözebilmemin bir yolu var mı?

Her cevap için şimdiden teşekkür ederiz.


Eski stil 8.3 adlandırma kurallarını Windows 3.1'de çalıştırmak için kod yazıyormuş gibi kullanarak yapabilir misiniz?
fixer1234

Yanıtlar:


8

Bir NTFS bölümünde, maksimum yol uzunluğu yaklaşık 32,760 karakterdir (32,767'den biraz daha az). Ancak, MAX-PATH hala 260'tır. "MAX-PATH" den daha uzun yollara hala erişilebilir ve "genişletilmiş uzunluklu yol" olarak adlandırılır.

Bu sayfaya göre: Maksimum Yol Uzunluğu Sınırlaması

Uzun bir yol belirtmek için "\\? \" Ön ekini kullanın. Örneğin, "\\? \ D: \ çok uzun yol".

Ayrıca, "genişletilmiş bir yol" un her zaman "mutlak" bir yol olduğunu unutmayın. Bir "genişletilmiş uzunluklu yol" için "göreceli bir form" belirtemezsiniz.

Tam komut dosyanızı çalıştırmayı denemedim, ancak komut isteminden küçük bir test yaptım ve göründüğü gibi görünüyor.

Örneğin:

@for /f "usebackq delims=" %f in (`dir /s /b "\\?\c:\Blah"`) do @echo %f

Şunun gibi bir liste döndürür:

\\?\c:\Blah\test
\\?\c:\Blah\test\aaa
\\?\c:\Blah\test\bbb
\\?\c:\Blah\test\aaa\folder1
\\?\c:\Blah\test\aaa\folder2
\\?\c:\Blah\test\aaa\folder1\File1.txt
\\?\c:\Blah\test\aaa\folder1\File2.txt
\\?\c:\Blah\test\aaa\folder2\File1.txt
\\?\c:\Blah\test\aaa\folder2\File2.txt
\\?\c:\Blah\test\bbb\folder1
\\?\c:\Blah\test\bbb\folder2
\\?\c:\Blah\test\bbb\folder1\Diff.txt
\\?\c:\Blah\test\bbb\folder1\Same.txt
\\?\c:\Blah\test\bbb\folder2\Diff.txt
\\?\c:\Blah\test\bbb\folder2\Same.txt

Ve:

C:>dir /-c /a /w /s /x "\\?\c:\Blah" | findstr /b /c:"  "

İade:

           0 File(s)              0 bytes
           0 File(s)              0 bytes
           2 File(s)            660 bytes
           2 File(s)            654 bytes
           0 File(s)              0 bytes
           2 File(s)            654 bytes
           2 File(s)            660 bytes
 Total Files Listed:
           8 File(s)           2628 bytes
          20 Dir(s)      3268722688 bytes free

Tam olarak ihtiyacınız olan şey gibi görünmüyor, bu nedenle "dir / findstr" komutunuzda bazı düzenlemeler yapmanız gerekecek.

260 karakterden fazla yolum \ dosyam yok, bu yüzden "çok uzun" yollarda ne olduğunu söyleyemem ama çalışması gerekiyor.


Kullanmakta olduğunuz Yol bir UNC yolu ise, yukarıda bağlantı verilen sayfa şunu söyler:

"\\? \" Öneki, evrensel adlandırma kuralına (UNC) göre oluşturulan yollarla da kullanılabilir. UNC kullanarak böyle bir yol belirtmek için "\\? \ UNC \" önekini kullanın. Örneğin,
"\\? \ UNC \ server \ share", burada "server" bilgisayarın adı ve "share" paylaşılan klasörün adıdır. Bu önekler yolun kendisinin bir parçası olarak kullanılmaz.

Yorumunuzda verdiğiniz UNC yoluna uyacak bir örnek şöyle belirtilmelidir:

dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "

Cevabın için teşekkürler. Benim durumumda bu konum bir ağ adresidir, bu yüzden o konumu verdiğiniz komutun içine koyarsam, dir / -c / a / w / s / x "\\? \\\ 10.91.49.10 \ klasör1 gibi olur. \ folder2 "| findstr / b / c: "" Bu komutu çalıştırdığımda, Dosya adı, dizin adı veya birim etiketi sözdizimi
ajith

@ajith - Bunu açıklamak için cevabımı daha da ekledim ... Bir UNC yolu belirtmek için öneki kullanmanız gerekir: şöyle "\\?\UNC\":dir /-c /a /w /s /x "\\?\UNC\10.0.0.10\folder1\folder2" | findstr /b /c:" "
Kevin Fegan

1
Dediğiniz gibi komutu değiştirdikten sonra bile (\\? \ UNC \ eklendi), hala aynı hatayı alıyorum Dosya adı, dizin adı veya birim etiketi sözdizimi yanlış
aj

2
Bunun eski bir soru olduğunu biliyorum, ama Ajith'in dediği gibi - bu ikisi de benim için işe yaramaz, ben bunu \\? \ Ve \\? \ UNC \ ile ekledim ve K: sürücüsüne eşledim ve yaptım \ \? \ K: \ bunların hepsi hala dosya adı veya uzantısı ile sonuçlanıyor çok uzun
StanM

0

Bilgiyi tutan fiziksel sunucunun aynı klasörlere erişimde herhangi bir sorunu olmadığını varsayarak çalışmam için tek yol, bir sürücü harfini dizinde gezinme işleminin başladığı klasöre eşlemek, bilgisayar adresini kaldırmak. ve yol uzunluğundan paylaşım ismi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.