avec PowerShell (bien que d'autres suggestions soient les bienvenues), comment en boucle récursivement un répertoire / dossier et p>
5 Réponses :
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 );
Je peux dire que c'est non testé, il n'y a aucun moyen de courir. :)
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) }
C'est peu complexe, alors je le testerais comme un script.
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' }
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". :)
Avec quelques exigences Raffinements, j'ai fini avec ce script:
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?
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>
[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" } }
@Brokenhearte Toute raison pour laquelle vous souhaitez modifier mon édition ?
@Antay aucune raison pour le faire beaucoup mieux.
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.