2016-04-11 22 views
0

セットディレクトリ内のフォルダやファイルの名前で特定の操作を実行しようとしています。powershellを使ってファイル名とディレクトリを操作する

  • は、私は(何も( " ")
  • 私は小文字の馬力を交換してると何も( "")
  • 私はスペースを交換しています("")とアンダースコア( "_")を交換しています大文字馬力とスペース( "HP "と "馬力"))
  • 私は大文字の馬力とスペース( "HP " と大文字の馬力(" HP")を交換しています)
  • 私はキャメルケースを交換していますhp( "Hp")と大文字のhpとスペース( "HP ")
  • 私は大文字 ( "A")と小文字( "A")を交換しています... B ... Cなど

これは私のPowerShellスクリプトです:

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("_","") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ","") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("hp","HP ") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("HP","HP ") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Hp","HP ") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("&"," & ") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("a","A") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("b","B") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("c","C") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("d","D") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("e","E") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("f","F") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("g","G") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("h","H") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("i","I") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("j","J") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("k","K") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("l","L") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("m","M") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("n","N") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("o","O") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("p","P") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("q","Q") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("r","R") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("s","S") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("t","T") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("u","U") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("v","V") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("w","W") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("x","X") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("y","Y") } 
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("z","Z") } 

私は知っている、それは本質的にループの束です。

私は、問題や疑問のカップルいた:

  1. 上記のコードは大文字( - Z)と小文字を置き換えるため動作しません、なぜですか?再帰的にも常に働かないようです。 E.Gフォルダ名HP 14-Z040wm、ファイル内はHP14-Z040WM
  2. このスクリプトはどうすればよいでしょうか?短く、速いなどのように

私はこれを作り始めたとき、私は間違いなく(私の最初の選択肢を受け入れるだろうと(I)は、同様のバッチファイルソリューションをバッチファイルをタグ付き。

+0

まあ、確かに楽しいの一口です。あなたは正しいものを移動しないアイテムの名前を変更しようとしていますか? – Matt

+0

@Mattはい、名前を変更します。 – GrumpyCrouton

答えて

3

まず、アイテムを一度取得してから一度だけ処理します。次に、文字置換をToUpper()メソッドで置き換えることができます。第3に、これらのメソッドはすべて文字列を返すので、メソッドを連鎖させるだけで済みます。

これは、ファイルのために十分に簡単です:

Get-ChildItem -Recurse -File | ForEach-Object { 
    $NewName = $_.Name.ToUpper().Replace('_','').Replace(' ','').Replace('HP', 'HP '); 
    Rename-Item -Path $_.FullName -NewName $NewName; 
} 

フォルダは、しかし、ワックスの全体の他のボールです。フォルダパスの名前を同じ名前に変更することはできず、パス名では大文字と小文字が区別されません。したがって、Rename-ItemでもMove-Itemも単独で動作しません。一時的なフォルダ名を使用する必要があります。

ここでは、ファイルとフォルダの両方のためのコードです:

#Unique name for temp folder 
$TempFolderName = [System.Guid]::NewGuid().Guid; 

Get-ChildItem -Recurse | ForEach-Object { 
    $NewName = $_.Name.ToUpper().Replace('_','').Replace(' ','').Replace('HP', 'HP '); 
    if (!$_.PSIsContainer) { 
     #Regular file 
     Rename-Item -Path $_.FullName -NewName $NewName; 
    } 
    else { 
     #Get the parent folder 
     $ParentFolder = Split-Path $_.FullName; 

     #Rename folder to temp name 
     Rename-Item -Path $_.FullName -NewName (Join-Path $ParentFolder $TempFolderName); 

     #Rename temp name to folder 
     Rename-Item -Path (Join-Path $ParentFolder $TempFolderName) -NewName (Join-Path $ParentFolder $NewName); 
    } 
} 
+0

素晴らしい作品です、ありがとうございます。 – GrumpyCrouton

1

あなたは、ファイルの名前を変更する必要があります最初のフォルダとフォルダの両方を同時に実行しようとすると、パイプライン内の他のオブジェクトが無効になり、エラーが発生する可能性があります。-replace "\s|_" andで保存することができます.ToUpper(). -replace`は、すべてのスペースとアンダースコアを何も置き換えないでください。これらも連鎖することができますので、名前の冒頭にHPを置き換えてスペースを追加します。

$path = "C:\Temp" 
Get-ChildItem $path -Recurse -Directory | Rename-Item -NewName {($_.Name).ToUpper() -replace "\s|_"} -WhatIf 
Get-ChildItem $path -Recurse -File | Rename-Item -NewName {($_.Name).ToUpper() -replace "\s|_"} -WhatIf 

私は-WhatIfをテストのためにそこに入れました。このコードがエンティティ名の大文字と小文字を変更するだけであれば、ファイル/フォルダ名が異なる必要がある(フォルダは大文字と小文字を区別しません)というエラーが表示されます。したがって、最初に一時フォルダに移動する必要があります。 Windowsでは大文字と小文字が区別されないため、オブジェクトの名前を同じにすることができます。

非常にこのコードを実行すると、フォルダ名が一時的な名前に永続的に変更されるので、このコードを慎重に実行する必要があります。プロセスが失敗した場合は、破損したフォルダを手動で修正する必要があります。その場合、.bakフォルダを探します。私のテストはうまくいけばうまくいけばそれはちょうど予防策です。独自のテストを実行して確実に実行してください。

$path = "C:\Temp" 

# Rename folders 
Get-ChildItem $path -Recurse -Directory | ForEach-Object{ 
    # Save the current name 
    $originalName = $_.Name 
    # Make sure the temp name is unique. 
    $temp = Rename-Item -Path $_.FullName -NewName "$originalName.bak" -PassThru 
    # Rename using the saved name and proposed changes. 
    $temp | Rename-Item -NewName ($originalName.ToUpper() -replace "\s|_" -replace "^HP","HP ") 
} 

Get-ChildItem $path -Recurse -File | Rename-Item -NewName {$_.Name.ToUpper() -replace "\s|_" -replace "^HP","HP "} 
+0

私は2つの答えを正しいものとして選択したいと思います。 – GrumpyCrouton

関連する問題