如何在出现Powershell异常的地方显示行号

时间:2019-06-13 20:29:01

标签: powershell powershell-3.0

我的Powershell脚本抛出一个异常,但是没有给我抛出异常的行号:

The process cannot access the file 'C:/path/to/foo.txt' because it is being used by another process.
+ CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand
+ PSComputerName        : localhost

我认为这里的最佳实践是重构脚本,以使用try / catch块来精确缩小引发Set-Content异常的位置-但在这种情况下,由于脚本的大小/范围脚本,我试图避免该选项。

相反,我希望有一些自上而下的解决方案-例如,能够以增加的冗长性调用脚本,这样Powershell会在堆栈跟踪中打印行号(非常确定Python默认情况下执行此操作。)

Powershell 3.0本身支持吗?

编辑:可接受的答案to this question涉及“尝试/捕获”方法,我提到的不是我的首选方法。再有,当引发异常而无需强制尝试/捕获时,是否可以通过某种方法使PowerShell报告行号?我是否必须将整个脚本包装在通用try / catch中?我是否必须使用一些--verbose标志来调用脚本? Powershell 3.0是否支持类似的功能?

1 个答案:

答案 0 :(得分:1)

Set-PsDebug将在脚本运行时在控制台上打印每个命令。

public class ParentLensRequest extends AbstractLensRequest implements [long list of classes] {
    private Map<String, Interval> intervals = new LinkedHashMap<>();

    public Set<Interval> getPeriods() {
        if (CollectionUtils.isEmpty(this.intervals)) {
            this.intervals = new LinkedHashMap<>();
        }
        return intervals.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toCollection(LinkedHashSet::new));
    }
    @Override
    public void addInterval(Interval interval) {
        Objects.requireNonNull(interval, "Interval is required");
        this.intervals.put(interval.getName(), interval);
    }
    @Override
    public void updateInterval(String name, LocalDate startDate, LocalDate endDate, Optional<String> nameWithDates,
            Optional<String> longName) {
        //more code
    }
}

@Getter
@Setter
public class ChildLensRequest extends ParentLensRequest {
  private ContextObject context;
}