I'm trying to run some inline C# code in PowerShell with the purpose of refreshing Windows explorer.
Here is the code:
function Request-ExplorerRefresh {
$code = @"
using System;
namespace VSYSRefresh
{
public static class Util
{
public static void RefreshExplorer(){
Console.WriteLine("Refreshing Explorer");
// based on http://stackoverflow.com/questions/2488727/refresh-windows-explorer-in-win7
Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
object shellApplication = Activator.CreateInstance(shellApplicationType);
object windows = shellApplicationType.InvokeMember("Windows", System.Reflection.BindingFlags.InvokeMethod, null, shellApplication, new object[] { });
Type windowsType = windows.GetType();
object count = windowsType.InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, windows, null);
for (int i = 0; i < (int)count; i )
{
object item = windowsType.InvokeMember("Item", System.Reflection.BindingFlags.InvokeMethod, null, windows, new object[] { i });
if(item != null){
Type itemType = item.GetType();
}
// only refresh windows explorer
string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
}
}
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
Invoke-Expression "[VSYSRefresh.Util]::RefreshExplorer()"
}
I am getting the following errors:
(26,43): error CS0165: Use of unassigned local variable 'itemType'
(string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
Cannot add type. Compilation errors occurred.
Unable to find type [VSYSRefresh.Util].
I can't even get Console.WriteLine()
to work. Do I need to reference certain assemblies to get this working?
I'm at a dead end and any help would be greatly appreciated.
CodePudding user response:
The error is in your for loop here:
if(item != null){
Type itemType = item.GetType();
}
// only refresh windows explorer
string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
Since you're declaring Type itemType
inside the if
statement, the next line won't be able to run since it's out of context. Change this block to:
if (item != null) {
Type itemType = item.GetType();
// only refresh windows explorer
string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
}