سؤال

هل هناك طريقة بسيطة لفي بوويرشيل (أتصور باستخدام Gacutil.exe) يدويا قراءة من نص الوثيقة مسار \ التجمع وتسجيله في GAC؟ هكذا على سبيل المثال ملف txt التي تبدو مثل:

c:\test\myfile.dll
c:\myfile2.dll
d:\gac\gacthisfile.dll

والسيناريو بوويرشيل أن قرأت أن في تيار ثم قم بتشغيل gacutil على كل من تلك المجالس وجدت؟ واعتقد انه سيكون شيئا مثل:

#read files into array?

foreach ($file in Get-ChildItem -Filter "*.dll" )
{ 
  Write-Host $file.Name
  C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /nologo /i $file.Name
}
هل كانت مفيدة؟

المحلول

إذا فرز ملف النص بحيث كل دلل على سطر منفصل، يمكنك استخدام الأمر Get-المحتوى والأنابيب كل لالتصفية التي فعلت الأمر الخاص بك:

filter gac-item { C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /nologo /i $_}

get-content fileOfDlls.txt | ?{$_ -like "*.dll"} | gac-item

نصائح أخرى

وماذا عن السماح للقلق صافي حول gacutil؟

# load System.EnterpriseServices assembly
[Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices") > $null

# create an instance of publish class
[System.EnterpriseServices.Internal.Publish] $publish = new-object System.EnterpriseServices.Internal.Publish

# load and add to gac :)
get-content fileOfDlls.txt | ?{$_ -like "*.dll"} | Foreach-Object {$publish.GacInstall($_)}

وأود أن أقترح استدعاء الدالة إضافة التجميع إلى GAC شيء المبادئ التوجيهية التالية بوويرشيل مثل الإضافية GacItem. أيضا موقع gacutil.exe باختلاف النظام الخاص بك. إذا كان لديك VS 2008 مثبتا، ينبغي أن يكون في الموقع هو مبين أدناه.

function Add-GacItem([string]$path) {
  Begin {
    $gacutil="$env:ProgramFiles\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe"

    function AddGacItemImpl([string]$path) {
      "& $gacutil /nologo /i $path"
    }
  }
  Process {
    if ($_) { AddGacItemImpl $_ }
  }
  End {
    if ($path) { AddGacItemImpl $path }
  }
}

Get-Content .\dlls.txt | Split-String | Add-GacItem

لاحظ أن الأمر cmdlet سلسلة سبليت يأتي من Pscx . وظيفة ليست فائقة قوية (أي دعم البدل لا يتحقق لأنواع غريبة مثل التاريخ والوقت) ولكن على الأقل يمكن التعامل العادي الاحتجاج وخط أنابيب الاحتجاج.

هل تريد استبدال gacutil.exe؟ إذا لم يكن كذلك، لماذا لا تستخدم وشملت التبديل / ايل gacutil على ذلك؟

ومن gacutil / ساعة:

/il <assembly_path_list_file> [ /r <...> ] [ /f ]
  Installs one or more assemblies to the global assembly cache.
  <assembly_list_file> is the path to a text file that contains a list of
  assembly manifest file paths. Individual paths in the text file must be
  separated by CR/LF.
  Example: /il MyAssemblyList.txt /r FILEPATH c:\projects\myapp.exe "My App"
    myAssemblyList.txt content:
    myAsm1.dll
    myAsm2.dll

إذا قمت بإنشاء اسم مستعار في ملفك الشخصي (فقط اكتب $ الشخصي في موجه ملاحظة لتحديد هذا الموقع الملف) مثل ذلك new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") ثم يمكنك استخدام GAC مثل ذلك:

get-childitem $basedirectory "*$filter.dll" | foreach-object -process{ WRITE-HOST -FOREGROUND GREEN "Processing $_"; gac /i $_.FullName /f}

والجزء الأخير هو الأكثر أهمية. يدعو gacutil مع رموز التبديل الذي تريده.

وآمل أن يساعد هذا.

وهذا السيناريو بوويرشيل سيضيف التجميعات إلى GAC دون استخدام GacUtil. http://blog.goverco.com/2012 /04/use-powershell-to-put-your-assemblies.html

الوظيفة الإضافية AssemblyToGlobalAssemblyCache.ps1 تحميل يمكنك نشر إلى GAC.

والاستخدام سبيل المثال لإضافة مجالس متعددة Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

واطلع على وثائق كاملة عن طريق تشغيل Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

وعدم الرغبة في تثبيت SDK ويندوز 8 على جميع الآلات وكنت بحاجة لوضع التجميعات في GAC للحصول على gacutil، لقد كتبت وحدة بوويرشيل باستخدام API GAC. وهي تعمل مع أي إصدار صافي. مع بوويرشيل GAC يمكنك أن تفعل ذلك كما يلي:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top