2009-08-17 15 views
6

Qualcuno può spiegare la differenza tra la chiamata di uno script perl tramite l'associazione di file e la chiamata dello stesso script esplicitamente tramite perl.exe?Perl su Windows, associazioni di file e reindirizzamento I/O

Apparentemente il reindirizzamento I/O non funziona molto bene quando lo script viene chiamato tramite associazione file e mi piacerebbe davvero sapere perché.

E.g. dai uno sguardo allo Activestate FAQ for Perl on Windows. L'esempio cat file funziona perfettamente fintanto che lo script non riceve il suo input tramite reindirizzamento. Così

cat file.txt 

opere come previsto, ma

whoami | cat.pl 

non lo fa. Non è necessaria solo l'estensione .pl, ma a quanto pare l'output di whoami non viene reindirizzato nello script. Lo script viene eseguito (che può essere verificato modificando lo script cat.pl di esempio), ma per qualche motivo non riceve l'input di whoami come input.

Tuttavia, se io chiamo lo script come questo:

whoami | perl cat.pl 

tutto funziona come previsto.

Quindi apparentemente c'è una differenza importante tra l'esecuzione dello script tramite associazione file e la chiamata esplicita perl.exe con lo script.

Le FAQ menzionano il problema e sottolinea che l'utilizzo di pl2bat per generare una copertina di file bat per lo script risolve il problema, ma non capisco perché sia ​​necessario.

Per favore mi illumini.

+0

Che cosa intendi esattamente quando dici "associazione file"? – innaM

+0

Per associazione file intendo che l'estensione .pl è associata con perl.exe. Si prega di consultare le domande frequenti collegate in quanto contiene i dettagli. –

risposta

9

Sembra che si sia verificato un errore noto in Windows 2000: STDIN/STDOUT Redirection May Not Work If Started from a File Association.

Ho lo stesso comportamento che descrivi con Strawberry Perl su WinXP, tuttavia una volta creata la voce del Registro di sistema descritta nell'articolo precedente (anche se la voce reg è indirizzata a Win2K), stdin funziona come previsto.

Per completezza, nel caso in cui il link qui sopra va via, l'entrata reg suggerisce creare è:

  1. Avviare l'editor del Registro di sistema.
  2. Individuare e selezionare la seguente chiave di registro: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  3. dal menu Modifica, scegliere Aggiungi valore e quindi aggiungere il seguente valore di registro:
    • Nome valore: InheritConsoleHandles
    • dati : REG_DWORD
    • Radice: i dati Decimal
    • Valore: 1
  4. Chiudere l'editor del Registro di sistema.

Edit: Dovrei aggiungere che, anche se l'articolo KB sostiene che è stato fissato in XP SP1, ho SP3 XP installato. Quindi, se MS ha rotto questo, o non l'ha mai corretto completamente, non posso dirlo!

+0

Sospettavo che si trattasse di un problema di Windows e non di un problema Perl. Grazie per il link. Con il registro aggiornato funziona come previsto. –

+0

Se l'applicazione di patch al registro non è un'opzione che esegue 'foo | perl -S bar.pl' è meno fastidioso per aggirare gli script nel PERCORSO. –

+0

Grazie, e sì il fatto che quella pagina KB afferma che il problema è "risolto" in XP SP1 quando la correzione del registro deve ancora essere applicata manualmente è irritante! Il problema principale è che non si può presumere che un PC arbitrario che esegue> = XP SP1 consentirà il reindirizzamento ... Questo è esattamente il tipo di cosa che permette agli insetti "It Works On My Machine" di prosperare ... –

0

So che questo è un thread vecchio, ma è importante notare che Microsoft sembra aver invertito la polarità di questa impostazione in Windows 10. Non ho idea del motivo per cui lo avrebbero fatto, ma questo mi ha fatto tirare i capelli per un giorno. Vedi la mia altra domanda inviata (Perl Scripts on Windows 10 run from Explorer but not Command Prompt), e in particolare il post MSDN collegato lì.

Problemi correlati