26

Powershell 2.0を使用して、一連のファイルの名前を再帰的に変更しようとしています。ディレクトリ構造は次のようになります。

Leaflets
+ HTML
  - File1
  - File2
  ...
+ HTMLICONS
  + IMAGES
    - Image1
    - Image2
  - File1
  - File2
  ...
+ RTF
  - File1
  - File2
  ...
+ SGML
  - File1
  - File2
  ...

次のコマンドを使用しています。

get-childitem Leaflets -recurse | rename -newname { $_.name.ToLower() }

ファイルの名前を変更しているようですが、サブディレクトリについて不平を言っています。

Rename-Item : Source and destination path must be different.

robocopyを使用してデータを毎月リロードしますが、ディレクトリは変更されないため、手動で名前を変更できます。get-childrenサブディレクトリ(のような)をスキップする方法はありますfind Leaflets -type f ...か?

ありがとう。

更新:問題は、すでにすべて小文字になっているファイルにあるようです。コマンドを次のように変更してみました:

get-childitem Leaflets -recurse | if ($_.name -ne $_name.ToLower()) rename -newname { $_.name.ToLower() }

しかし、Powershellifは、コマンドレットや関数などではないと文句を言います。の出力をステートメントにパイプできますget-childitemif

更新2:これは機能します:

$files=get-childitem Leaflets -recurse
foreach ($file in $files)
{
    if ($file.name -ne $file.name.ToLower())
    {
        rename -newname { $_.name.ToLower() }
    }
}
4

8 に答える 8

30

あなたはすでにあなた自身の答えを投稿していますが、ここにバリエーションがあります:

dir Leaflets -r | % { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

いくつかのポイント:

  • dirはGet-ChildItemのエイリアスです(-rは-Recurseの略です)。
  • %はForEach-Objectのエイリアスです。
  • -cneは大文字と小文字を区別する比較です。-neは大文字と小文字の違いを無視します。
  • $ _は、ForEach-Objectループで現在のアイテムを参照する方法です。
  • renは、 Rename-Itemのエイリアスです。
  • FullNameは、適切なファイルに確実にアクセスできるため、おそらく推奨されます。

ディレクトリの名前変更を除外したい場合は、次のようなものを含めることができます。

if ((! $_.IsPsContainer) -and $_.Name -cne $_.Name.ToLower()) { ... }

これがPowerShellの学習と探索を継続するのに役立つことを願っています。

于 2010-09-29T16:13:23.367 に答える
18

このタスクを簡素化するために、Rename-Itemに直接パイプし、-パラメーターを指定してScriptblocksを使用できることに注意してNewNameください(パイプライン入力も受け入れるため)。

Get-ChildItem -r | Where {!$_.PSIsContainer} | 
                   Rename-Item -NewName {$_.FullName.ToLower()}

およびエイリアス付き:

gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}
于 2010-09-29T16:51:50.657 に答える
2

特定のタイプのファイルの名前だけを更新したい場合は、これを少し調整してみてください。

get-childitem *.jpg | foreach { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

これにより、フォルダ内のjpgファイルのみが小文字になり、残りは無視されます

于 2013-10-15T14:41:13.727 に答える
2

一時的に名前を別の名前に変更してから、すべて小文字に戻す必要があります。

$items = get-childitem -Directory -Recurse

foreach ($item in $items)
{

   if ($item.name -eq $item.name.ToLower())
   {    

       $temp = $item.FullName.ToLower() + "_"
       $name = $item.FullName.ToLower()
       ren $name $temp

       ren $temp $name
   }
于 2016-09-07T16:43:44.923 に答える
2

Rename-Item、配管、ループ、およびWindowsファイルシステムの動作の性質により、前述の回答には多くの問題があります。残念ながら、特定のフォルダー内のすべてのファイルとフォルダーの名前を小文字に変更するために私が見つけた最も単純な(ここでは読みやすさのためにエイリアスを使用しない)ソリューションは次のとおりです。

Get-ChildItem -Path "/Path/To/You/Folder" -Recurse | Where{ $_.Name -cne $_.Name.ToLower() } | ForEach-Object { $tn="$($_.Name)-temp"; $tfn="$($_.FullName)-temp"; $nn=$_.Name.ToLower(); Rename-Item -Path $_.FullName -NewName $tn; Rename-Item -Path $tfn -NewName $nn -Force; Write-Host "New Name: $($nn)";}
于 2018-06-19T09:38:36.727 に答える
0

PowerShellでは、パイプラインwhereの代わりに使用する方が理想的です。if

gci-Recurseリーフレット|
    ?{$_。Name-ne$ _。Name.ToLower())} |
    %{ren -NewName $ _。Name.ToLower()}
于 2010-10-11T01:49:38.317 に答える
0

ジェイ・バズジからの答えに対する小さいが重要な訂正。-cnewhere-partが何かを返す必要がある場合は、(大文字と小文字を区別しない)演算子を使用する必要があります。

さらに、Pathパラメーターが存在する必要があることがわかりました。このバージョンは私のセットアップで機能しました:

gci -Recurse | 
    ? { $_.Name -cne $_.Name.ToLower() } | 
    % { ren $_.Name -NewName $_.Name.Tolower()  }
于 2020-02-19T15:41:01.877 に答える
0

このスレッドをフォローしているすべての人のために。次の行を使用して、ファイルとディレクトリの両方を下げることもできます。

Get-ChildItem -r  | Rename-Item -NewName { $_.Name.ToLower().Insert(0,'_') } -PassThru |  Rename-Item -NewName { $_.Name.Substring(1) }

メインの投稿:https ://stackoverflow.com/a/70559621/4165074

于 2022-01-03T20:53:28.250 に答える