我们有一个文件服务器来处理收到的文件。当文件因任何原因无法处理时,它将被移动到失败文件夹中。我编写了一个脚本来迭代这些文件夹中的每一个文件夹,并将文件的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计划任务之间的交互。
答案 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
{
}