2017-12-12 2 views
-1

受信したファイルを処理するファイルサーバーがあります。ファイルが何らかの理由で処理に失敗すると、そのファイルは障害フォルダに移動さ​​れます。私はこれらのフォルダのすべての可能なものを反復し、ファイルのFullNameを私に送る電子メールに吐き出すためのスクリプトを書いた。powershellはファイルのフルネームを自動タスクとしてのみ切り捨てます

これを手動で実行すると、正常に動作します。しかし、スケジュールされたタスク(ローカルシステムとして実行中)としてスクリプトを実行すると、スクリプトは正常に実行されますが、電子メールには次のようなパスが含まれています\\blahblah\blah\blahblahblah\bl.....

スクリプトを数多く、出力は同じになります。手動で実行すると、意図したとおりに動作します。自動スクリプトとして実行すると、FullNamesが切り捨てられます。私はこの問題を持つ他の人たちを見つけましたが、自動化されたタスクではありませんでした。

これはスクリプトの関連コードです。

$emailFileList = "" 
$filelist = @() 

try { 
    GCI $topLevelPath -Recurse | 
     ? { $_.PSIsContainer } | 
     ForEach-Object { 
      dir $_.FullName | 
       Where-Object {$_.FullName -like $unableToProcess} | ForEach-Object { 
        $filelist += dir $_.FullName 
       } 
     } 
    $emailFileList = Out-String -InputObject $($filelist | Select-Object FullName | Format-Table -AutoSize) 
    $emailBody = $emailBody + $emailFileList 
} 

EDIT:

私は、以下のHTMLメソッドを使用しますが、ジャンクマークアップの束を追加しました。マークアップを引用符で置き換えるために4行追加しました。 tryブロックの内部はこのようになり、スケジュールされたタスクとしても機能します。 Regardling答え、「重複」上記の問題は、特にPowerShellとWindowsスケジュールタスク間の相互作用である:

GCI $topLevelPath -Recurse | 
    ? { $_.PSIsContainer } | 
    ForEach-Object { 
     dir $_.FullName | 
      Where-Object {$_.FullName -like $unableToProcess} | ForEach-Object { 
       $filelist += dir $_.FullName 
      } 
    } 
$emailFileList = $filelist | Select-Object FullName | ConvertTo-Html -fragment 
$emailFileList = [regex]::Replace($emailFileList, "<table>.+</th></tr>", "") 
$emailFileList = $emailFileList -replace '<tr><td>', '"' 
$emailFileList = $emailFileList -replace '</td></tr>', """`r`n" 
$emailFileList = $emailFileList -replace '</table>', '' 
$emailBody = $emailBody + $emailFileList 

私は私がnoooooooo

をやっているのhtmlにも技術的に使用正規表現の編集と思います。

+0

'DIR'と' GCI'は 'Get-ChildItem'と'? '/' Where-Object'と同じエイリアスです。 – TheIncorrigible1

+0

あなたの問題については、 'Select-Object -ExpandProperty 'FullName''を使ってフォーマッタを取り除いてください – TheIncorrigible1

+0

また、これらはお互いのエイリアスですが、私はこのスクリプトを40回書き直したので疲れています。 – user3657661

答えて

-1

Format-Table -Autosizeを使用していたので、PowerShellインスタンスの1行あたりの文字数のために、おそらく切り捨てられていました。 -FragmentコマンドでConvertTo-Html関数を使用して、HTMLテーブルを作成することができます。

はこのような何か試してみてください:コンソールホストは、完全な文字列をレンダリングすることはできませんので

$emailFileList = "" 
$filelist = @() 

try { 
    Get-ChildItem $topLevelPath -Recurse ` 
    | Where-Object -Property PSIsContainer -EQ -Value $True ` 
    | ForEach-Object { 
     Get-ChildItem $_.FullName | 
      Where-Object -Property FullName -Like -Value $UnableToProcess ` 
      | ForEach-Object { 
       $filelist += Get-ChildItem $_.FullName 
      } 
    } 
    $emailFileList = $filelist | Select-Object FullName | ConvertTo-Html -Fragment 
    $emailBody = $emailBody + $emailFileList 
} 
catch 
{ 

} 
+0

重大なアクセントを改行として使用するのはひどいことです。ラインの終わりにパイプを残しておくと、パイプは必要ありません。 – TheIncorrigible1

+0

あなたのスクリプトを書く方法@ TheIncorrigible1 –

+0

私はあなたのコメントを投票することができたらいいですね。それは矛盾している。 –

-1

をあなたの問題は、フォーマッタ切り捨てです。ここでは、あなたが望むことができる名前のリストを持つtxtを得る解決策があります。

一般的な経験則:フィルタは左、書式は右です。

#Requires -Version 3 
Try 
{ 
    Get-ChildItem -Path $TopLevelPath -Recurse -Folder | 
     ## If you're on version 2, replace the -Folder switch with the following: 
     #Where-Object { $_.PSIsContainer } 
     ForEach-Object { 
      ## If version 2, remove @().FullName and replace with 
      # | Select-Object -ExpandProperty FullName 
      $FileList = @(Get-ChildItem -Path $_.FullName -Filter "*$UnableToProcess*").FullName 
     } 
    $EmailBody += @($FileList) 
} 
Catch 
{ 

} 
関連する問題