PowerShell: выполнение C# Class (FindFiles) в качестве определения Add-Type в удаленной системе с использованием ConvokeC#

Место общения программистов C#
Anonymous
 PowerShell: выполнение C# Class (FindFiles) в качестве определения Add-Type в удаленной системе с использованием Convoke

Сообщение Anonymous »

Я хочу найти все файлы package.json в удаленной системе, используя PowerShell. Чтобы оптимизировать это, я нашел класс C# в Интернете, а теперь и хотел бы использовать его.
$Result = Invoke-Command -ComputerName "RemoteSystem" -ScriptBlock {
Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Linq;
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

public class FileSearch {
public struct WIN32_FIND_DATA {
public uint dwFileAttributes;
public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
public uint nFileSizeHigh;
public uint nFileSizeLow;
public uint dwReserved0;
public uint dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
}

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern bool FindClose(IntPtr hFindFile);

static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
static BlockingCollection fileList {get;set;}

public static BlockingCollection GetFiles(string searchDir, string searchFile) {
bool isPattern = false;
if (searchFile.Contains(@"?") | searchFile.Contains(@"*")) {
searchFile = @"^" + searchFile.Replace(@".",@"\.").Replace(@"*",@".*").Replace(@"?",@".") + @"$";
isPattern = true;
}
fileList = new BlockingCollection();
SearchDirectory(searchDir, searchFile, isPattern);
return fileList;
}

private static void SearchDirectory(string path, string searchFile, bool isPattern) {
IntPtr handle = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA fileData;

path = path.EndsWith(@"\") ? path : path + @"\";
handle = FindFirstFile(path + @"*", out fileData);
if (handle != INVALID_HANDLE_VALUE) {
FindNextFile(handle, out fileData); // Skip "." entry
while (FindNextFile(handle, out fileData)) {
if ((fileData.dwFileAttributes & 0x10) > 0) { // Directory
string fullPath = path + fileData.cFileName;
SearchDirectory(fullPath, searchFile, isPattern);
} else { // File
if (isPattern) {
if (Regex.IsMatch(fileData.cFileName, searchFile, RegexOptions.IgnoreCase)) {
string fullPath = path + fileData.cFileName;
fileList.TryAdd(fullPath);
}
} else {
if (fileData.cFileName.Equals(searchFile, StringComparison.OrdinalIgnoreCase)) {
string fullPath = path + fileData.cFileName;
fileList.TryAdd(fullPath);
}
}
}
}
FindClose(handle);
}
}
}
"@ -IgnoreWarnings

$searchFile = "package.json"
$lookupPath = "C:"
$Files = @()
$Files = @([FileSearch]::GetFiles($lookupPath,$searchFile))

return $Files

}

$Result
< /code>
Я переписываю код с помощью get-cililtem, который прекрасно работает на удаленной машине и локально.
Я попытался использовать скрипт через Psexec (копирование сценария на удаленную машину и запустив его там), Invoke-Command, интерактивная сессия PowerShell, но результаты-это то же самое. Когда я запускаю код локально, вы можете видеть код, что использование диска 80% и 30% использование ЦП, но с командой invoke всего 30% использования ЦП и использование диска 0-1%.
, так что время выполнения локально (когда я подписываю на удаленную машину с помощью RDP), примерно 10 секунды, а когда пробегает моя машина, которая не будет пробежать, что не будет на месте, которая не является локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые не являются локальными, которые также невыполнены, что не будет на месте, которое не является локальными, которые также невыполнены. Системный процесс выполняет поиск диска (имеет высокий дискридж), и когда запуск удаленной системы, кажется, даже не задействована. < /p>
Я хотел бы знать, почему это так. GCI выполняет работу, но мне это не волнует. Я действительно очень хотел бы знать, почему этот код очень медленный только в удаленной системе.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ion-on-a-r

Вернуться в «C#»