Hi there
I have a problem running Powershell commands with ExeOutput. I have a script that reads data from the %ProgramData% folder. If it is not in the C: drive, I need to find it. To do this, I need to read which drives are local hard drives (as opposed to any network drives), and I am doing this by using exec() and a Powershell command.
The script runs fine in a browser, but refuses to work from ExeOutput. It just hangs and does nothing. When I close my app, the window closes but the process is still running in the background and does not die.
This is my code:
Any help would be appreciated.
Many thanks,
Zoe
Might help you along. Use something like below to ID local drives (over network drives) and find Windows dirâs in my softwareâs built for school use:
// Identify all drives
for ($letter = 'a'; $letter <= 'z'; $letter++) {
if (is_dir($letter . ':')) {
echo $letter . ':\\' . PHP_EOL;
}
}
// Get path to ProgramData folder
$programDataPath = getenv('ProgramData');
// Check if it is a directory
if (is_dir($programDataPath)) {
// Open the directory
if ($handle = opendir($programDataPath)) {
// Read all items in the directory
while (false !== ($entry = readdir($handle))) {
echo $entry . PHP_EOL;
}
// Close the directory
closedir($handle);
}
}
Been awhile since looked at actual code in my program, so above is just example. Cannot recall if I had to add the COM extension for PHP or not.
There are some other ways no doubt. Support may be able to recommend better. I do not know about the %ProgramData% folder, but this worked for me on the Public Doc folder, maybe there is something similar for the ProgramData folder:
function GetPublicDocPath: String;
begin
Result := GetSpecialFolderPath(46);
end;
Then you can get the path in PHP thanks to:
$path = exo_return_hescriptcom (âUserMain.GetPublicDocPathâ, ââ);
1 Like
Heya oldteacher
I tried similar code to yours, but it still has the issue of not being able to tell if the drive is local or networked, unless I am missing something ?
I did find a different command that works in CMD rather than Powershell though, which doesnât hang.
wmic logicaldisk get deviceid, description
which gives
Description DeviceID
Local Fixed Disk C:
Local Fixed Disk D:
Local Fixed Disk E:
Local Fixed Disk F:
Network Connection G:
Network Connection H:
Network Connection R:
Network Connection Z:
Currently waiting for my friend to test, but would still like to know why Powershell wonât work. I canât seem to find any errors. It just hangs.
I have a look at the 2nd bit in a while.
Many thanks,
Zoe
Of course. I am not a exeout guru. My recommendation is to forget my code and wait on exeout support. But I will give you one tip:
Posting your code in an image instead of in a code tag would help other to see what you are trying. I personally would never try to enter your code from an image and test it.
I HAD to !! When I tried to paste it, I got an error from the website â403 Forbiddenâ so something in my code wasnât allowed.
LOL, been there on this board, sometimes really picky on code. One thing I have learned is NEVER include php or script tags.
Give support a few days, they may have a much better solution than mine.
1 Like
Now Iâve got time - Iâll try to work out what it wasâŚ
Hi all
Just discovered that the method I had found (using WMIC) was depricated in Win 10, in favour of Powershell
This means I really need to get Powershell working, or I might pick up network drives.
Pasting code here can be a challenge.
Have you tried to run your program with administrator privileges? May be required to run powershell.
Now I am kind of looking into the dark, but maybe this will help you:
$fso = new COM('Scripting.FileSystemObject');
$D = $fso->Drives;
$type = array("Unknown","Removable","Fixed","Network","CD-ROM","RAM Disk");
foreach($D as $d ){
$dO = $fso->GetDrive($d);
$s = "";
if($dO->DriveType == 3){
$n = $dO->Sharename;
}else if($dO->IsReady){
$n = $dO->VolumeName;
$s = file_size($dO->FreeSpace) . " free of: " . file_size($dO->TotalSize);
}else{
$n = "[Drive not ready]";
}
echo "Drive " . $dO->DriveLetter . ": - " . $type[$dO->DriveType] . " - " . $n . " - " . $s . "<br>";
}
function file_size($size)
{
$filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
return $size ? round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
}
Only thing to remember is PHP COM extension is required for above code.
Looks like I better start exploring powershell myself
1 Like
THAT WORKED (The script that is).
Thanks so much I can work with that
Many thanks,
Zoe
1 Like
Glad I could help. Have spent many hours over the past 10 years beating my head on desk when working with exeout. Love exeout but can be challenging at times.
1 Like
Now I have another question. What would M 2 drives show as being ? Would they fall under âFixedâ or âRAM Diskâ ? (I donât even have a computer with a slot for one )
EDIT:
Apparently they would show as âFixedâ.
âRAM Diskâ refers to the RAM Disks that first appeared back in Dos 3.0 days and apparently are still supported today !
Definitely fixed. My desktop has one and confirmed it will be shown as fixed:
1 Like