powershell仅将文件全名截断为自动化任务

时间:2017-12-12 14:47:20

标签: powershell scheduled-tasks

我们有一个文件服务器来处理收到的文件。当文件因任何原因无法处理时,它将被移动到失败文件夹中。我编写了一个脚本来迭代这些文件夹中的每一个文件夹,并将文件的FullName吐出到一封电子邮件中,然后发送给我。

现在,当我手动运行它时,它运行正常。但是,当我将其设置为计划任务(作为本地系统运行)时,脚本仍然成功运行,但电子邮件包含\\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
}

编辑:

我使用下面的HTML方法,但它添加了一堆垃圾标记。我添加了4行来用引号替换标记。 try块的内部现在看起来像这样,它甚至可以按计划任务工作。

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

我想我在技术上也在html上使用了正则表达式我做了什么noooooooo

编辑:重新回答“重复”上面的问题特别是PowerShell和Windows计划任务之间的交互。

3 个答案:

答案 0 :(得分:0)

这给出了你可能期望的那种输出

[command] | Format-Table -AutoSize | Out-String -Width 10000 #| clip.exe

答案 1 :(得分:-1)

由于您使用Format-Table -Autosize,因为powershell实例中每行的字符数量可能会截断。您可以使用ConvertTo-Html函数和-Fragment命令来创建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
{

}

答案 2 :(得分:-1)

您的问题是格式化程序截断,因为控制台主机无法呈现完整字符串。这是一个解决方案,您可以获得一个带有可以随意使用的名称列表的文本

一般经验法则:向左过滤,向右格式化。

#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
{

}