2016-09-22 6 views
0

私はPowershellを初めて使用しています。私は援助が必要なループ内に問題があります。私は、ループ内のプロセスの一部として作成されたいくつかのファイルの名前を変更しようとしています。 私はループの外側のコードをテストして正常に動作します。しかし、私がループに入れようとすると、何も起こりそうにない。私は名前を変更する必要があるファイルは次の場所にあるPowershell次のループの前にループする問題

... (1)「\ MYSERVER \ MyCompanyの\ MYFOLDER \ MyPrintouts \ EstimateImport \ ImportPrintout.txt」 (2)「\ MYSERVER \ MyCompanyの\ MYFOLDER \ MyPrintouts \ PostEntries \ ImportPostEntries.txt "

最後に日付と時刻を付ける必要があります。このコードはループの外で私のために働く。私は

#Define actions after an Event is Detected 
$action = {$files = Get-ChildItem -Path $watcher.Path -Filter $watcher.Filter #-Recurse 
     foreach ($file in $files) 
     { 
     #Define variables for log file 
     $changeType = $Event.SourceEventArgs.ChangeType #Your event trigger "Created" 
     $fileDate = $file.LastWriteTime #Date/Time Estimate was created 
     #logline contains = Date/Time of import, Created, Date/Time Created, filename 
     $logline = "$(Get-Date), $changeType, $fileDate, $file" 

     #Actions to take ============================================================== 
     #Write details to the log 
     Add-Content "“\\MYSERVER\MYCOMPANY\MYFOLDER\EstimateImportLog.txt" -value $logline 
     #Copy the estimate to the "ToBeProcessed" folder 
     Copy-Item $file.FullName -Destination $copyTo 
     #Move the estimate to the "EstimateHistory" folder 
     Move-Item $file.FullName -Destination $moveTo -Force 
     #Run the powershell script that launches the .bat file that launches the macro 
     Invoke-Expression "& '\\MYSERVER\MYCOMPANY\MYFOLDER\PSscriptToRunBATfile.ps1'" 
     #Pause the script for 30 seconds to allow the estimate to finish posting 
     Start-Sleep -Seconds 30 
     Invoke-Expression "& '“\\MYSERVER\MYCOMPANY\MYFOLDER\RenameFiles.ps1'" 
     } 
     } 

これはいるようだ...私は次のファイルが処理される前に名前が変更されたファイルをしたいと私はループにこれを追加しましたどのようにこれはRenameFiles.ps1

#File location 
$ImportPrintout = “\\MYSERVER\MYCOMPANY\MYFOLDER\MyPrintouts\EstimateImport\ImportPrintout.txt” 
$ImportPostEntries = “\MYSERVER\MYCOMPANY\MYFOLDER\ MyPrintouts\PostEntries\ImportPostEntries.txt” 

#Find and rename the import printouts 
Get-ChildItem $ImportPrintout -Filter "ImportPrintout.txt" | ForEach-Object {   
      Rename-Item $_.FullName "$BackupFolder$($_.BaseName -replace " ", "_" -replace '\..*?$')$(Get-Date -Format "MMddyyyy-HHmmss").txt"} 

Get-ChildItem $ImportPostEntries -Filter "ImportPostEntires.txt" | ForEach-Object {   
      Rename-Item $_.FullName "$BackupFolder$($_.BaseName -replace " ", "_" -replace '\..*?$')$(Get-Date -Format "MMddyyyy-HHmmss").txt"} 

という名前のファイルに入れて私のループを "壊す"。しかし、次のファイルに行く前にこれを行う必要があります。移動する前にこれらのファイルの名前を変更する方法を教えてください。どんな支援も大歓迎です。ありがとうございました!

+1

2つのコードセグメントは、互いに関係がありません。 2番目のコードセクションにリネームアイテムが表示されません。名前を変更するにはコピーアイテム/ムーブアイテムを使用していますか?もしそうなら、どこに$ copyToと$ moveToを設定しますか?まさにあなたのループを壊しているのは何ですか?一度実行して停止するだけですか? – Arluin

+0

私はスクリプトファイルに入れた最初のコードをRenameFiles.ps1という名前にしました。その後、私のループの最後の行でそのファイルを呼び出します。ただし、ファイルの名前が変更されず、$アクションの開始時にフォルダ内に複数のファイルがある場合、次のファイルに進むように見えません。私がその行をコメントアウトすると、$ actionは意図したとおりに次のファイルにループします。私がRenameFiles.ps1をループとは独立して実行すると、それは私がしたいことをします。次のファイルに行く前に、印刷物の名前を変更する方法について、私はこれをどうやってやるのか提案していますか?ありがとう! – mdgaw

答えて

0

ループが失敗する限り、おそらくエラーが発生している可能性があります。あなたの$ ErrorActionPreferenceをContinueに設定するか、Stopとして、コピーアイテムとムーブアイテムのtry/catchブロックをラップして、エラーを検出して処理します。 これはおそらくコピーアイテム/ムーブアイテムのファイル名の変更に失敗したため、そのアクションを実行しようとしてエラーが発生し、失敗している可能性があります。

+0

示されているように、私はPowershellを初めて使用しています。したがって、私は昨日から今日までのコードで何も変更していないので、非常に貴重な教訓を学んだことがあります。しかし、今日のコードは動作します!うん、うん! – mdgaw

+0

今日私は別のことをしました。私は自分のイベントを登録解除して、再びスクリプトを開始しました。以前は、私は変更を加えて保存するだけでした。それがなぜ変わるのかよくわかりませんが、今日はうまくいきます! – mdgaw