2017-06-27 12 views
-1

私は、このコードをPowershellに適用して、名前に含まれる親ディレクトリを含む別のフォルダにファイルをコピーして名前を変更するためのnewbです:親ディレクトリのファイルをコピーして名前を変更する

オリジナル

originalfilename.txt 

新しい名前

parentfolder originalfilename.txt 

私はそれが動作しません。次のコードを使用してみてください。私は間違って何をしていますか?

$Root='C:\Users\Bart\Documents' 
Get-ChildItem -Recurse | 
ForEach-Object { 
$ParentOjbect = $_.Directory 
$Parent = $ParentOjbect.Name 
Copy-item -Destination (Join-Path $Root ('{0}{1}{2}' -f $Parent, " ", $_.Name)) } 

本当に変数がすでにインスタンス化されていると仮定し、仕事、コード更新この

についてのヘルプや専門知識をお願い申し上げ:

Get-ChildItem -Path $Source -Recurse -Force | Where-Object {$_.Name -notcontains "Archive"}| 
ForEach-Object { 
    if(!$_.PSIsContainer){ 
    $DateStr = $_.BaseName.Substring(0,2)+'/'+$_.BaseName.Substring(3,2)+'/'+$_.BaseName.Substring(6,4) 
    $FileDate = get-date $DateStr 
    If ($FileDate -ge $Date) { 
     Copy-Item -Path (Join-Path -Path $Src -ChildPath '\*') -Destination (Join-Path $Dst ("$($_.Directory.Name) $($_.Name)")) -WhatIf 
      #Dst is the same as $Root 
    }} 
} 
+0

私はあなたが新しいユーザーであり、既にいくつかの投票を行った。それがあなたを落胆させないようにしてください。私たちは皆、時々ダウン投票します。 PowerShellでファイルをコピーすることについては、すでに多くの質問と回答があります。最初にこれらの質問と回答を調べるか、スクリプトを小さなタスクに分割して、まずコピー作業をしてから名前を変更してから、2つの概念をマージする方法を知っておくことをおすすめします。 –

+1

アドバイスと励ましをありがとう。私は本当にPowershellに慣れていません。これは私の最初のプログラミングインターンシップでの2日目です。私はそれを念頭に置いておきます。 –

+1

"*私はこのコードを持っていても動作しません*"というのは、シンタックスエラーから論理的な誤解まで、 "うまくいかない" "それは実行されますが、私が期待していることはしません"、すべて異なる修正を加え、あなたが見たいものと見たいものを見たいと言う必要があります。あなたのコードは「うまくいっていて動作しています。私は、 "Path"のプロンプトは、Copy-Itemがコピーされるべきものを知らないということを推測するつもりです。 '$ _ | 'をパイプする必要があります。 Copy-Item -Path $ _。FullName ... 'を指定します – TessellatingHeckler

答えて

0

TesselatingHecklerが既にCopy-Item指摘したように動作するようにソースオブジェクトを必要としますに。

現在のフォルダーがルートフォルダーの場合、無限ループや処理済みアイテムの繰り返しが発生する危険があるので、Get.ChildItem -recurseをかっこにします。

フォーマット式
'{0}{1}{2}' -f $Parent, " ", $_.Nameを簡略化することができます
'{0} {1}' -f $Parent,$_.Name

あなたはGCIの-FileパラメータまたはWhere {!($_.PSIsContainer)} |

コピーアイテムを使用してPowerShellのバージョンにdependig、あなたGCIからディレクトリを除外すべきです$_.Directory.Nameを直接参照することができるので、ForEachおよび中間変数の必要はありません。

$Root = "$($Env:USERPROFILE)\Documents" 
(Get-ChildItem -Recurse) | Where {!($_.PSIsContainer)} | 
    Copy-Item -Dest {Join-Path $Root ("$($_.Directory.Name) $($_.Name)")} -WhatIf 

出力が正常に見える場合は、最後の行の-WhatIfを削除します。

> tree /F . 
C:\TEST\2017 
│ SO_16-51.ps1 
├───06 
│ ├───20 
│ │ │ SO_44639321.cmd 
│ │ │ SO_44639321.ps1 
│ │ │ SYS_PURCHASES_20170617.xls 
│ │ │ SYS_PURCHASES_20170618.xls 
│ │ │ SYS_PURCHASES_20170619.txt 
│ │ │ SYS_PURCHASES_20170619.xls 
│ │ └───Destination 
│ └───24 
└───2017-01 
    └───16 
     │ get-Isocontent.ps1 
     │ IsoDates.psm1 
     │ IsoDateStuff.ps1 
     │ Measure-IP.cmd 
     │ Using-Isodates.ps1 
     └───VM20 
       test.csv 
       test.txt 

私の空のRAMディスクAで$ルートでスクリプトを実行する:


木と私のtestfolder以降

$Root = "A:\" 
(Get-ChildItem -Recurse) | Where {!($_.PSIsContainer)} | 
    Copy-Item -Dest {Join-Path $Root ("$($_.Directory.Name) $($_.Name)")} 

\にこれらの結果のファイルを与える:\

> tree /F A:\ 
A:\ 
    2017 SO_16-51.ps1 
    20 SO_44639321.cmd 
    20 SO_44639321.ps1 
    20 SYS_PURCHASES_20170617.xls 
    20 SYS_PURCHASES_20170618.xls 
    20 SYS_PURCHASES_20170619.txt 
    20 SYS_PURCHASES_20170619.xls 
    16 get-Isocontent.ps1 
    16 IsoDates.psm1 
    16 IsoDateStuff.ps1 
    16 Measure-IP.cmd 
    16 Using-Isodates.ps1 
    VM20 test.csv 
    VM20 test.txt 
+0

LotPingsありがとうございました。構文に詳しい。これはPowerShellで初めてのプロジェクトです。ソースオブジェクトがあると仮定して、自分のコードのフルバージョンを別の場所に投稿しました。リンク先はhttps://stackoverflow.com/questions/44804406/rename-and-copy-select-files-in-nestedです。 -directory-powershell –

+0

プロジェクトを完了しました。あなたの助けをありがとうLotPings –

+0

あなたがあなたの回答を参考にしてくれたら、投票していただきありがとうございました。これは両方の質問に当てはまります。 – LotPings

関連する問題