我有一些 PowerShell 脚本,其中包含以下内容:
$ErrorActionPreference = "stop"
trap { Write-Error $_.Exception; }
Run Code Online (Sandbox Code Playgroud)
使用 powershell 重定向运算符从 powershell 窗口调用脚本时:
c:\somescript.ps1 2> c:\error.txt
Run Code Online (Sandbox Code Playgroud)
它只会将错误打印到 powershell 窗口,而不会将其重定向到文件。如果我从脚本中删除 $ErrorActionPreference = "stop",则重定向有效,但这不是一个可行的选择,因为我们需要脚本在遇到任何错误时终止。我也尝试过使用 '*>',但结果相同。
有什么方法可以将错误重定向到文件而无需更改所有脚本?
所以我有一个与此类似的方法:
public List<T> SomeFunction(Expression<Func<T, bool>> predicate) {
return someList.Where(predicate).ToList();
}
Run Code Online (Sandbox Code Playgroud)
该代码不可编译,因为我无法将谓词传递给linq Where语句。有没有一种方法可以更改谓词以便与linq一起使用?
当您在多个线程中在C#中新建一个新列表时,每个线程是否都有自己的列表实例?
所以我的代码看起来类似于:
List<Item> _items = new List<Item>();
public void Method(List<List<Batch>> batches) {
Parallel.ForEach(batches, parallelOptions, (batch, state) => CalculateAndAddToList(batch))
}
private void CalculateAndAddToList(List<Batch> batch) {
//Some computations
var localItems = new List<Item>();
foreach(var b in batch) {
//Computations of newItems
localItems.AddRange(newItems);
}
_items.AddRange(items);
}
Run Code Online (Sandbox Code Playgroud)
我将随机得到一个错误:"目标数组不够长.检查destIndex和长度,以及数组的下限." 在该行说:"localItems.AddRange(newItems)".由于每个线程都在新建自己的localitems列表实例,我认为其他线程不会改变它,所以为什么在该行上出现错误?
我想我需要围绕"_items.AddRange(项目)"的锁,因为多个线程同时访问和更改共享领域"_items",但我还没有得到一个线程错误扔在这条线.