Newsgroup: it.comp.lang.perl
Titolo: versione di un file

Salve a tutti,
nel logon script del dominio NT che amministro dovrei trovare la versione di
vari file per poi aggiornarli, ho fatto qualcosa con il cmd.exe di winnt, ma
purtroppo mi sono bloccato
FOR /F "usebackq tokens=4" %v in (`FILEVER /AD
%SystemRoot%\SYSTEM32\vbscript.dll`) DO SET VBVER=%v
(FILEVER.EXE lo trovate nel resource kit)
questa riga di shell "cmd" mi funziona solo su win2k, purtroppo su winnt40
non è possibile utilizzare l'opzione "usebackq" quindi ho pensato di
utilizzare il perl per risolvere il mio problema.
Ecco le mie domande:
a) è possibile con qualche modulo perl settare una variabile con la versione
del file esaminato (VBVER nell'esempio sopra)
b) nel caso che non esista un tale modulo posso fare qualcosa del genere?
    @vb = exec "FILEVER /AD %SystemRoot%\SYSTEM32\vbscript.dll"
ho provato ma non sembra funzionare, forse sbaglio qualcosa?
Grazie in anticipo per l'aiuto.
Federico.

 ho provato ma non sembra funzionare, forse sbaglio qualcosa?
Il tuo problema e` di elaborare la stampa a video di un programma 
esterno (FILEVER.EXE). In Perl e` possibile acquisire in una variabile, 
scalare o vettoriale, a seconda delle necessita`, tale stampa, mediante 
l'operatore backtick (`` oppure qx{}), che--guarda un po'!--ricorda 
molto il "backq" di Win2K (o, meglio, viceversa).
	$vb=qx{FILEVER /AD %SystemRoot%\\SYSTEM32\\vbscript.dll}
	$ perldoc perlop
-- 
Baci,
Mony

 del file esaminato (VBVER nell'esempio sopra)
puoi usare questo snippet per trovare la versione di un file direttamente da
Perl. codice molto sporco, ma funziona ;-)
  $vbver = FileVersion( "$ENV{SystemRoot}\\SYSTEM32\\vbscript.dll" );
  #================
  sub FileVersion {
  #================
    use Win32::API;
    $GetFileVersionInfoSize = new Win32::API(
      "version", "GetFileVersionInfoSize", [P, P], N
    );
    $GetFileVersionInfo     = new Win32::API(
      "version", "GetFileVersionInfo", [P, N, N, P], N
    );
    $VerQueryValue          = new Win32::API(
      "version", "VerQueryValue", [P, P, P, P], N
    );
    my($file) = @_;
    my $size = 0;
    my $psize = pack("p", $size);
    my $infosize = $GetFileVersionInfoSize->Call($file, $psize);
    # print "GetFileVersionInfoSize returned: $infosize\n";
    my $verbuf = "\0" x $infosize;
    my $error = $GetFileVersionInfo->Call($file, $size, $infosize, $verbuf);
    # print "GetFileVersionInfo returned: $error\n";
    $version = TryVersion($verbuf, "F\0i\0l\0e\0V\0e\0r\0s\0i\0o\0n\0\0",
"\0\0", 2);
    if($version == -1) {
      $version = TryVersion($verbuf, "FileVersion\0", "\0", 0);
      if($version == -1) {
        return "No version found.";
      } else {
        return $version;
      }
    } else {
      return $version;
    }
  }
  #===============
  sub TryVersion {
  #===============
    my($buffer, $trystart, $tryend, $add) = @_;
    my $version;
    my $start = index($buffer, $trystart);
    if($start == -1) {
      return -1;
    } else {
      $start += length($trystart) + $add;
      my $end = index($buffer, $tryend, $start);
      if($end == -1) {
        return -1;
      } else {
        $version = substr($buffer, $start, $end-$start);
        $version =~ s/\0//g;
        return $version;
      }
    }
  }
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;

Grazie mille,
Federico.