7
votes

Comment remplacer la chaîne dans les fichiers et les noms de fichiers et de dossiers récursivement avec PowerShell?

avec PowerShell (bien que d'autres suggestions soient les bienvenues), comment en boucle récursivement un répertoire / dossier et

  1. Remplacez le texte A avec B dans tous les fichiers,
  2. renommer tous les fichiers de sorte que A est remplacé par B, et dernier
  3. renommer tous les dossiers également pour que A est remplacé par B?

2 commentaires

Vous voulez donc une commande / une fonction qui remplacera A avec B dans le contenu du fichier, les noms de fichiers et les noms de dossier ou sont séparés dans chacun de ces cas?


"Une commande / fonction qui remplacera A avec B dans le contenu du fichier, les noms de fichiers et les noms de dossiers" est le cas.


5 Réponses :


0
votes

non testé, mais devrait vous donner un point de départ:

$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 commentaires

Je peux dire que c'est non testé, il n'y a aucun moyen de courir. :)



0
votes

non testé, peut être plus chanceux; -)

$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)
}


1 commentaires

C'est peu complexe, alors je le testerais comme un script.



3
votes

J'irais avec quelque chose comme ceci:

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' }


1 commentaires

Et la question est: pourquoi? :) Comme quelqu'un "autour des ordinateurs", vous le savez que "ça ne marche pas" est aussi digne que si vous disiez rien. Le message d'erreur est utile. Sinon, pas besoin de dire "ça ne marche pas". :)



15
votes

Avec quelques exigences Raffinements, j'ai fini avec ce script: xxx


2 commentaires

C'est génial. Lorsque les gens réalisent ce que ce script vous permettra de faire, vous obtiendrez beaucoup plus de upvotes ... merci.


J'ai eu des dossiers et des espaces de noms dans des fichiers de code me donnant des noms de problèmes tels que Namespace.TestConsole (dossier) et pareille pour certains de mes espaces de noms, ce script a ensuite apporté de nombreux fichiers vides appelés ces noms, alors il crée également de nouveau neuf des dossiers. Y a-t-il un moyen de s'assurer que cela ne remplace et ne crée pas?



0
votes

J'en avais besoin pour moi-même et en dessous de la version légèrement meilleure du script.

J'ai ajouté des suivantes: p>

  1. Prise en charge du paramètre Verbose afin que vous puissiez réellement voir quels changements ont apporté le script. Li>
  2. possibilité de spécifier des dossiers afin que vous puissiez limiter les modifications. LI>
  3. Ajout de Bower.json, TXT et MD pour inclure des extensions. LI>
  4. recherche et remplacez le contenu d'abord, renommez plus tard. li>
  5. ne remplace pas le contenu si la chaîne de recherche n'est pas trouvée (cela évite les modifications inutiles de la date modifiée). LI> OL>
    [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"
        }
    }
    


2 commentaires

@Brokenhearte Toute raison pour laquelle vous souhaitez modifier mon édition ?


@Antay aucune raison pour le faire beaucoup mieux.