2011-04-13 13 views
7

PowerShell (हालांकि अन्य सुझावों का स्वागत है) के साथ, कैसे एक रिकर्सिवली पाश एक निर्देशिका/फ़ोल्डर औरPowerShell के साथ फ़ाइलों और फ़ाइल और फ़ोल्डर नामों में स्ट्रिंग को प्रतिस्थापित करने के लिए कैसे?

  1. की जगह सभी फाइलों में बी के साथ पाठ ए,
  2. नाम बदलने सभी फाइलों को करता है तो यह है कि एक बी की जगह , और अंतिम
  3. सभी फ़ोल्डर्स का नाम बदलें ताकि ए को बी द्वारा प्रतिस्थापित किया जा सके?
+0

तो आप चाहते हैं एक आदेश/समारोह है कि उन मामलों में से प्रत्येक में फ़ाइल की सामग्री, फ़ाइल नाम, और फ़ोल्डर नाम में बी के साथ एक बदलने के लिए या ए और बी अलग कर रहे हैं होगा? –

+0

"एक कमांड/फ़ंक्शन जो फ़ाइल सामग्री, फ़ाइल नाम और फ़ोल्डर नामों में ए के साथ बी को प्रतिस्थापित करेगा" मामला है। –

उत्तर

12

कुछ आवश्यकताओं को शोधन के साथ, मैं इस स्क्रिप्ट के साथ समाप्त हो गया:

$match = "MyAssembly" 
$replacement = Read-Host "Please enter a solution name" 

$files = Get-ChildItem $(get-location) -filter *MyAssembly* -Recurse 

$files | 
    Sort-Object -Descending -Property { $_.FullName } | 
    Rename-Item -newname { $_.name -replace $match, $replacement } -force 



$files = Get-ChildItem $(get-location) -include *.cs, *.csproj, *.sln -Recurse 

foreach($file in $files) 
{ 
    ((Get-Content $file.fullname) -creplace $match, $replacement) | set-content $file.fullname 
} 

read-host -prompt "Done! Press any key to close." 
+1

यह कमाल है। जब लोगों को एहसास होता है कि यह स्क्रिप्ट आपको क्या करने की अनुमति देगी, तो आपको बहुत अधिक अपवर्त मिलेगा ... धन्यवाद। –

+0

मेरे पास कोड फ़ाइलों में कुछ फ़ोल्डर्स और नेमस्पेस थे जो मुझे नामस्थान नाम जैसे किसी नाम नाम दे रहे हैं। टेस्टकंसोल (फ़ोल्डर) और मेरे कुछ नामस्थानों के लिए भी यही है, इस स्क्रिप्ट ने फिर उन नामों को नामित बहुत खाली फाइलें बनाई हैं, इसलिए किसी भी तरह से यह भी बनाता है नई फाइलें क्या यह सुनिश्चित करने का कोई तरीका है कि यह केवल बदलता है और बनाता है? – FRoZeN

0

untested है, लेकिन आप एक प्रारंभिक बिंदु देना चाहिए:

$a = 'A'; 
$b = 'B'; 
$all = ls -recurse; 
$files = = $all | where{ !$_.PSIsContainer); 
$files | %{ 
    $c = ($_ | get-itemcontent -replace $a,$b); 
    $c | out-file $_; 
} 
$all | rename-item -newname ($_.Name -replace $a,$b); 
+1

मैं बता सकता हूं कि यह अनचाहे है, ऐसा कोई रास्ता नहीं है जो दौड़ जाएगा। :) – JasonMArcher

0

untested है, हो सकता है मैं और अधिक भाग्यशाली ;-)

 
$hello = 'hello' 
$world = 'world' 

$files = ls -recurse | ? {-not $_.PSIsContainer} 

foearch ($file in $files) { 
    gc -path $file | % {$_ -replace $hello, $world} | Set-Content $file 
    ri -newname ($file.name -replace $hello, $world) 
} 

ls -recurse | ? {$_.PSIsContainer} | ri -newname ($_.name -replace $hello, $world) 

ही प्रत्यावर्तन का उपयोग करने के हूँ:

 
$hello = 'hello' 
$world = 'world' 

$everything = ls -recurse 

foearch ($thing in $everything) { 
    if ($thing.PSIsContainer -ne $true) { 
    gc -path $thing | % {$_ -replace $hello, $world} | Set-Content $thing 
    } 
    ri -newname ($thing.name -replace $hello, $world) 
} 
+0

यह थोड़ा जटिल है, इसलिए मैं इसे एक स्क्रिप्ट के रूप में परीक्षण करूंगा। –

3

मैं इस तरह कुछ के साथ जाऊंगा:

Get-ChildItem $directory -Recurse | 
    Sort-Object -Descending -Property { $_.FullName } | 
    ForEach-Object { 
     if (!$_.PsIsContainer) { 
      ($_|Get-Content) -replace 'A', 'B' | Set-Content $_.FullName 
     } 
     $_ 
    } | 
    Rename-Item { $_.name -replace 'A', 'B' } 

Sort-Object यह सुनिश्चित करने के लिए है कि पहले बच्चे (subdirs, फ़ाइलें) सूचीबद्ध हैं और फिर उनके बाद निर्देशिकाएं हैं। (12345)

+0

यह काम नहीं करता है। –

+2

और सवाल यह है: क्यों? :) किसी के आसपास 'कंप्यूटर के आसपास' आप जानते होंगे कि "यह काम नहीं करता है" उतना योग्य है जितना कि आप कुछ भी नहीं कहते हैं। त्रुटि संदेश सहायक है। अन्यथा, "यह काम नहीं करता" कहने की कोई ज़रूरत नहीं है। :) – stej

0

मैं खुद के लिए इस की जरूरत है और स्क्रिप्ट के नीचे थोड़ा बेहतर संस्करण।

मैं निम्नलिखित कहा: वर्बोज़ पैरामीटर के लिए

  1. समर्थन ताकि आप वास्तव में देख सकते हैं कि स्क्रिप्ट में परिवर्तन कर दिया है।
  2. फ़ोल्डर निर्दिष्ट करने की क्षमता ताकि आप परिवर्तनों को सीमित कर सकें।
  3. एक्सटेंशन शामिल करने के लिए bower.json, txt और md जोड़ना।
  4. पहले सामग्री को खोजें और बदलें, बाद में नाम बदलें।
  5. यदि खोज स्ट्रिंग नहीं मिलती है तो सामग्री को प्रतिस्थापित न करें (इससे संशोधित दिनांक में अनावश्यक परिवर्तन से बचा जाता है)।
[CmdletBinding(SupportsShouldProcess=$true)] 
Param() 

$match = "MyProject" 
$replacement = Read-Host "Please enter project name" 

$searchFolders = @("MyProject.JS", "MyProject.WebApi", ".") 
$extensions = @("*.cs", "*.csproj", "*.sln", "bower.json", "*.txt", "*.md") 
foreach($searchFolderRelative in $searchFolders) 
{ 
    $searchFolder = join-path (get-location) $searchFolderRelative 
    Write-Verbose "Folder: $searchFolder" 

    $recurse = $searchFolderRelative -ne "." 

    if (test-path $searchFolder) 
    { 
     $files = Get-ChildItem (join-path $searchFolder "*") -file -include $extensions -Recurse:$recurse | 
        Where-Object {Select-String -Path $_.FullName $match -SimpleMatch -Quiet} 

     foreach($file in $files) 
     { 
      Write-Verbose "Replaced $match in $file" 
      ((Get-Content $file.fullname) -creplace $match, $replacement) | set-content $file.fullname 
     } 

     $files = Get-ChildItem $searchFolder -filter *$match* -Recurse:$recurse 

     $files | 
      Sort-Object -Descending -Property { $_.FullName } | 
      % { 
       Write-Verbose "Renamed $_" 
       $newName = $_.name -replace $match, $replacement 
       Rename-Item $_.FullName -newname $newName -force 
      }  
    } 
    else 
    { 
     Write-Warning "Path not found: $searchFolder" 
    } 
} 

ध्यान दें कि इस सवाल का जवाब से एक परिवर्तन यह है कि इसके बाद के संस्करण केवल निर्दिष्ट फ़ोल्डर में फ़ोल्डर recurses, जड़ में नहीं है। यदि आप इसे नहीं चाहते हैं तो बस $recurse = true सेट करें।

+0

@ ब्रोकनहार्ट किसी भी कारण से आप [मेरे संपादन को बदलना चाहते हैं] (http://stackoverflow.com/posts/23103932/revisions)? – Antony

+0

@ एंटनी इसे बेहतर बनाने के लिए कोई कारण नहीं है। –

0

नोटपैड ++ का उपयोग करें यदि आपके पास यह टूल नहीं है - तो आप फ़ाइल मैनिपुलेशन के लिए आवश्यक कई सुविधाओं पर अनुपलब्ध हैं।

इसमें एक प्रतिस्थापन सुविधा है जो आपको किसी दिए गए निर्देशिका में खोज करने, फ़ाइलों के लिए पैटर्न देने और regexp, एक विस्तारित सुविधा या सामान्य प्रतिस्थापन का उपयोग करने की अनुमति देता है।

शक्तिशाली उपकरण।

यह नि: शुल्क: (http://notepad-plus-plus.org/download/v6.6.9.html)

संबंधित मुद्दे

 संबंधित मुद्दे