2017-09-08 8 views
1

私はPowerShellの初心者ですので、間違った用語についてはお詫び申し上げます。私はSEを見てきましたが、再帰的にディレクトリ構造に降下する方法を知っていますが、私が見つけることができるすべての作業例はGet-ChildItemの出力をパイプしているようですが、前にファイルを処理する方法を理解できませんループが反復します。 C:\Users\Donglecow\myPictures\:私は再帰的ディレクトリのループ方法、ファイル名の一致とファイルの操作

  • がディレクトリで私のスクリプトを提供やろうとしている何

  • 定義されたディレクトリ内のすべてのディレクトリを再帰的にループします(広範なファイル構造を持っています)。
  • 、EGをフィルタthumbnail*.jpgに一致するすべてのファイルを検索します。thumbnail_001.jpg
  • ピクセル単位でその画像の大きさを確認し、どのようなコマンドラインに

をそれらをプリントアウトしBACKUP-thumbnail*.jpg

  • にファイルの名前を変更私は

    param (
        [string]$dir = $pwd 
    ) 
    write-output "Working from $($dir)" 
    
    $foundJpg = get-childitem -Recurse -Filter thumbnail*.jpg $dir 
    foreach($file in $foundJpg) { 
        write-output "Found $($file)" 
        #Rename to Backup... 
        #Check image dimensions... 
        #Do other stuff... 
    } 
    

    この作品、これまで持って、正しいファイルNAを出力しました私はファイルの名前を変更しようとするとエラーになります。

    Get-ChildItem -Recurse -Filter *.mp3 | Rename-Item –NewName { $_.name –replace 'xyz','abc' }

    :私はthis質問に答えに示すようにパイプ出力をコマンドから適応しようとしましたので、私はこれを控除してきました

    Rename-Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") }

    Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no 
    input. A script block cannot be evaluated without input. 
    At C:\Users\Donglecow\myPictures\med.ps1:9 char:23 
    + ... -Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") } 
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        + CategoryInfo   : MetadataError: (:) [Rename-Item], ParameterBindingException 
        + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.RenameItemCommand 
    

    は、おそらくです私は私のループのために私はさらに私が見つける各ファイルと対話することができる別の構造を使用しているのに対し、参考のため

    私の環境

    、私のファイル構造のスニペットは以下の通りです。

    C:\Users\Donglecow\myPictures\ 
    1\001\thumbnail_001.jpg 
    1\002\thumbnail_001.jpg 
    1\003\thumbnail_001.jpg 
    2\001\thumbnail_001.jpg 
    etc... 
    

    ここで私は間違っていますか?

  • 答えて

    1

    これを試してみてください:

    foreach($file in $foundJpg) { 
        $File | Rename-Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") } 
        #Do other stuff... 
    } 
    

    あなたは、これはあなたのForEachループがに使用しているものであるとして、(上記のように、あなたがパイプラインを経由して行うことができるはず)コマンドの入力として$fileを使用する必要がありますGet-ChildItemによって検索された各項目を$foundJpg変数に表します。

    +1

    ああ、そのような簡単な解決策です。ありがとう!私はそれがPoweshellでパイプラインがどのように機能しているかはわかりませんでした。 Linuxから来て、私はそれが両方のプラットフォームで同じように働いていると考えました。 – Donglecow

    関連する問題