Sunday, November 24, 2013

Recursively search and replace files from one folder into another

  1. $filter = '*.dll', '*.pdb'
  2. $copied = 0; $skipped = 0; $failed = 0
  3. $sourceFiles = $filter | % { Get-ChildItem $sourceDir -Filter $_ -Recurse } `
  4. | sort @{expression={$_.FullName.Length}} -Descending `
  5. | group Name -AsHashTable
  6. $targetFiles = $filter | % { Get-ChildItem $targetDir -Filter $_ -Recurse } `
  7. | ? { $sourceFiles.ContainsKey($_.Name) } `
  8. | sort FullName
  9. $targetFiles | % {
  10. $target = $_
  11. $sourceFiles[$target.Name] | % {
  12. $source = $_
  13. if ($target.FullName.EndsWith($source.FullName.Substring($sourceDir.Length),
  14. 'InvariantCultureIgnoreCase')) {
  15. if ($target.LastWriteTime.AddSeconds(2) -lt $source.LastWriteTime) {
  16. Write-Host $target.FullName
  17. try {
  18. Copy-Item $source.FullName $target.FullName -Force
  19. $copied++
  20. }
  21. catch {
  22. Write-Error $_.Message
  23. $failed++
  24. }
  25. }
  26. else {
  27. $skipped++
  28. }
  29. return
  30. }
  31. }
  32. }
  33. Write-Host "$copied copied, $skipped skipped, $failed failed in $($watch.Elapsed)"

Thursday, March 14, 2013

Programmatically configure a simple log4net trace appender

  1. var hierarchy = (Hierarchy) LogManager.GetRepository();
  2. var logger = (Logger) hierarchy.GetLogger(loggerName);
  3. logger.Level = Level.Debug;
  4. logger.AddAppender(new TraceAppender {Layout = new SimpleLayout()});
  5. hierarchy.Configured = true;
log4net

Monday, January 28, 2013

Convert an SQL like pattern into a regular expression pattern

  1. var pattern = Regex.Replace(
  2. likePattern,
  3. @"[%_]|\[[^]]*\]|[^%_[]+",
  4. match =>
  5. {
  6. if (match.Value == "%")
  7. {
  8. return ".*";
  9. }
  10. if (match.Value == "_")
  11. {
  12. return ".";
  13. }
  14. if (match.Value.StartsWith("[") && match.Value.EndsWith("]"))
  15. {
  16. return match.Value;
  17. }
  18. return Regex.Escape(match.Value);
  19. });

Saturday, January 12, 2013

Load test a web site using asynchronous requests and the TPL

  1. var queue = new Queue<Task>();
  2. while (true)
  3. {
  4. if (queue.Count >= 50)
  5. {
  6. var task = queue.Dequeue();
  7. task.Wait();
  8. task.Dispose();
  9. }
  10. var request = (HttpWebRequest) WebRequest.Create(url);
  11. var watch = Stopwatch.StartNew();
  12. queue.Enqueue(Task.Factory
  13. .FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null)
  14. .ContinueWith(task =>
  15. {
  16. using (var response = (HttpWebResponse) task.Result)
  17. {
  18. Console.WriteLine("{0}\t{1}\t{2}",
  19. response.StatusCode, response.ContentType, watch.Elapsed);
  20. }
  21. }));
  22. }
Task Parallel Library (TPL)