Come posso ottenere ftype & assoc per abbinare Esplora risorse?


20

Ho modificato l'associazione da utilizzare all'avvio di un .pyfile, tramite Esplora risorse:

  1. Strumenti -> Cartelle -> Tipi di file.
  2. Quindi sfogliare .py.
  3. Cambia l'associazione in Wordpad.

Ora quando scrivo il nome di un file PY nella riga di comando, Wordpad lo apre.

Ma assoce ftypenella riga di comando restituisce ancora quanto segue:

C:\> assoc .py
.py = Python.File

C:\> ftype Python.File
Python.File = "C:\Program\Python27\python.exe" "%1" %*

Come mai l'associazione sta lavorando, ma assoce ftypenon sono a conoscenza di esso?

Ho riavviato il prompt.


Maggiori informazioni dal mio registro:

HKEY_CLASSES_ROOT\.py
= Python.File

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
= wordpad.exe

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\OpenWithProgids\Python.File
= 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py\(Standard)
= Python.File

Più registro:

HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command\(Standard)
= "C:\Program\Python27\python.exe" "%1" %*`

Suppongo che questo sia ciò che si presenta ftype Python.File. Ma non sembra abituarsi.


(Lo sto facendo per i test, quindi alla fine posso scegliere facilmente la mia versione predefinita di Python).


Risposte:


9

A seconda di come si chiama un file dipenderà dal verbo utilizzato. Il verbo che usi determina ciò che Windows farà con esso. I verbi standard sono Apri, Modifica, Stampa, Riproduci e Anteprima. Tuttavia, è possibile creare i tuoi verbi . Il verbo più comunemente aggiunto è la famiglia Open With (inclusi OpenWithProgIDs), che aggiunge quel piccolo sottomenu contestuale in "Apri con" per darti possibili alternative. Se installi Paint.NET, ad esempio, e fai clic con il pulsante destro del mouse su un file .jpg, vedrai che la voce Apri con si espande in un sottomenu che elenca Paint.NET, Paint e qualunque cosa Microsoft abbia chiamato il visualizzatore di immagini per la tua versione di Windows.

Inoltre, ciò che ha detto Unsigned Code Labs è molto importante. Quando esegui il debug delle classi, devi guardare HKLM\Software\Classes\e HKCU\Software\Classes. HKCRè molto utile per interrogare il sistema, ma non così buono per scoprire perché si sta comportando male.

Ho fatto un piccolo test sul mio sistema Windows 7 procmon.exe, e i comandi assoce ftypesembrano provare a scrivere direttamente su HKCR, e il sistema sembra interpretarlo come scritto su HKLM. Il mio account corrente è un membro del gruppo admin, ma UAC è abilitato. Mi è stato negato l'accesso quando ho provato assoc .mytest=MyTest.File.

Stranamente, se creo un'associazione facendo clic con il pulsante destro del mouse su un file chiamato test.myteste associandolo a Blocco note, assocftypevedo né questa associazione. L'associazione è sicuramente lì dentro HKCUe HKCR. Non ho provato a riavviare, tuttavia.



@ Il link TheIncorrigible1 è morto :(
DaveInCaz il

@DaveInCaz Oh, è davvero triste. Sono infastidito dal fatto che abbiano rotto tutti i collegamenti al blog MSFT. Vedrò se posso ripristinarlo; si spera che abbia solo un nuovo link e non sia scomparso (come nel caso di altre cose)
TheIncorrigible1


5

non so come si possa fare la corrispondenza tra il registro e ciò che appare in ftype e assoc. Per me e come vedo anche per te il comando ftype e assoc sono inutili. Quello che faccio per cambiare il programma predefinito per una determinata estensione in modo programmatico (rispetto al modo standard e più semplice utilizzando Explorer) è modificare questa chiave di registro

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TheExtensionYouWantToModify\UserChoice\ProgID

Ad esempio, se voglio aprire i miei mp3 con mplayer, li inserisco

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice\ProgID 

il valore di "mplayerc.mp3"

Quali sono le complicazioni nel fare questo: prima devi conoscere i validi ProgID (usa ftype), e in secondo luogo devi accedere in scrittura a quell'alveare. Windows inserisce automaticamente un ACL di rifiuto per la chiave UserChoice, quindi è necessario trovare un modo per rimuovere quella regola di rifiuto per ottenere l'accesso in scrittura. Uso il programma subinacl, che è possibile scaricare da qui http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en per modificare le autorizzazioni. Inoltre è possibile utilizzare il programma di terze parti SetACL. Consiglio il primo perché la sintassi è molto più semplice.


3

Explorer (la shell di Windows) dà sempre la preferenza all'applicazione specificata nella chiave del fornitore che è specificata sotto il valore predefinito dell'estensione. (Nel tuo caso.py è l'estensione, Python.Fileè la chiave del fornitore.)

ftype e assoc possono leggere i loro valori da altre aree, non lo so per certo. Ecco come funziona Explorer.

MODIFICARE: Questa pagina potrebbe interessarti: MSDN - Tipi di file

Soprattutto questo:

La sottostruttura HKEY_CLASSES_ROOT è una vista formata dalla fusione HKEY_CURRENT_USER \ Software \ Classes e HKEY_LOCAL_MACHINE \ Software \ Classes.

Forse è qui che le diverse parti di Windows si scontrano, se esiste un'associazione "predefinita" in HKEY_LOCAL_MACHINE, che viene sovrascritta da quella che hai definito sul tuo account (che sarebbe poi memorizzato in HKEY_CURRENT_USER).


3

Microsoft ha cambiato il modo in cui funziona da Windows 8 in poi. Non è più possibile modificare il registro per cambiarlo. Per citare Microsoft :

In Pre-Win 8, le app potevano impostare il gestore predefinito per un tipo / protocollo di file manipolando il registro, ciò significa che si potrebbe facilmente avere uno script o un criterio di gruppo che manipola il registro. Tuttavia, in Win 8, le modifiche al registro sono verificate da un hash (univoco per utente e app) che rileva manomissioni da parte delle app. In assenza di un hash valido, ignoriamo l'impostazione predefinita nel registro.

Il modo in cui Microsoft si aspetta che tu cambi questo ora è con un file XML che viene implementato tramite Criteri di gruppo. Istruzioni qui .

Per fortuna Christoph Kolbicz ha invertito la progettazione dell'algoritmo di hashing e creato uno strumento chiamato SetUserFTA per impostare l'associazione del tipo di file. Purtroppo è chiuso.


SetUserFTA è super utile e può essere scritto.
DaveInCaz,

1

La confusione qui è tra ciò che viene utilizzato per aprire un file e ciò che viene utilizzato per eseguire un file. La chiave di registro

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
\.py\Application

è ciò che dice a Windows come aprire il file. Facendo doppio clic sul file si aprirà il file con questa applicazione.

Poiché il file non è un file eseguibile, la riga di comando presuppone che si desidera aprire il file con l'applicazione predefinita, come se si fosse fatto doppio clic su di esso.

La modifica dell'associazione in C: \ Program \ Python27 \ python.exe o la modifica della chiave del Registro di sistema per puntare a Python dovrebbe riportarla al modo in cui era in precedenza, dove Windows presuppone che si desidera aprire il file con il programma predefinito, che è python.exe, che quindi esegue il programma.


Se ho capito bene, la chiave .py\Applicationviene utilizzata per aprire i file PY. Quello che non capisco è in quali casi Python.Fileviene utilizzato il valore in .
Gauthier

Secondo Majenko dipende dal tempo dato l'estensione è trattata da Windows come eseguibile (vedi PATHEXTvariabile). Comunque ricordo di aver letto in passato che i soci creati da Explorer sovrascrivono sempre quelli dalla Classeschiave di registro.
Piotr Dobrogost,

1

Il tuo più grande indizio su scopo e posizione è nel "tipo grande", cioè i nomi dei rispettivi alveari: HKLM e HKCU

Le associazioni di file sono impostate in entrambi gli hive e hanno due scopi diversi:

Come suggerisce il nome, le voci di registro HKCU impostano le associazioni di file per l'UTENTE ATTUALE e sovrascrivono le impostazioni del tipo di file corrispondenti in HKLM.

HKLM imposta le associazioni di file per la MACCHINA LOCALE, ovvero per TUTTI GLI UTENTI della macchina (a meno che non vengano sovrascritti dalle voci HKCU). (Per Win98, HKCR era solo un alias abbreviato per HKLM \ Software \ Classes. Non erano alveari separati o diversi. Tuttavia, questo è cambiato per Win XP e non è più vero. HKCR è ora un alveare virtuale che è il risultato della fusione le chiavi HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ e HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts con le informazioni HKCU che hanno la precedenza.)

Questo sistema in due fasi facilita non solo gli schemi di associazione dei file uno a uno ma molti a uno e uno a molti. Ad esempio, i tipi di file .htm, .html e .shtml potrebbero essere tutti impostati su ProgID = file html che a sua volta potrebbe definire un singolo browser. OTOH, le voci potrebbero contenere sottochiavi OpenWithList o OpenWithProgID con più voci per aprire un file da un elenco di più browser, editor o altre app.

Sia HKLM \ Software \ Classes \ che HKCU \ Software \ Classes funzionano allo stesso modo (uno ha la precedenza sull'altro). Nella forma più semplice c'è una chiave di registro per un'estensione di file (ad es. HKCR.txt) il cui valore predefinito è il ProgID corrispondente (ad es. Txtfile). Oltre al valore predefinito o al suo posto, potrebbero essere elencati altri nomi ProgID per la sottochiave "OpenWithProgID" (ad es. File txt e file html) e / o nomi di applicazioni aggiuntivi che appaiono come sottochiavi in ​​"OpenWithList" (ad esempio, Blocco note ++ .exe, Opera.exe, Firefox.exe).

Ogni ProgID è definito in un'altra chiave all'interno di HKCR (ad es. HKCR \ txtfile). Questa chiave contiene sottochiavi per indicare a Windows quale icona utilizzare e come aprire, stampare, stampare, ecc. Il file associato (e., G, HKCR \ txtfile \ shell \ open \ command). Allo stesso modo, ogni nome di applicazione viene definito come sottochiave in HKCR \ Applicazioni (ad es. HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Oltre alla chiave HKCU \ Software \ Classes, le associazioni dei file degli account utente si trovano nella chiave HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Queste voci non sono solo per Windows Explorer come è stato suggerito, ma sono un'ulteriore fonte di override dell'associazione dei file degli account utente. Le voci vengono create dagli strumenti di associazione dei file in Explorer (Explorer \ Strumenti \ Opzioni cartella \ Tipi di file) e contengono una sottochiave OpenWithList e / o OpenwithProgID per ciascuna estensione di file elencata.

Per determinare un'associazione di file, Windows esamina innanzitutto le voci HKCU per un'estensione di file corrispondente. Solo se non ne viene trovato uno entrano in gioco le voci HKLM. (Nota: non ho testato quale ha la precedenza: HKCU \ Software \ Classes o HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts ma sospetto che sarebbe la chiave FileExts). Allo stesso modo, se un ProgID o un nome applicazione referenziato non vengono trovati in HKCU, vengono cercate le voci HKLM. (Si noti che \ Applicazioni \ voci sono solo nomi arbitrari, anche se in genere sono identici al nome del file exe effettivo su disco.)

Quindi, per definire un'associazione di file per un account utente specifico, creare voci nell'hive HKCU. Per definire un'associazione per tutti gli utenti, creare voci nell'hive HKLM (HKCR) ed eliminare tutti i riferimenti nell'hive HKCU a quel tipo di file. Ovviamente sono necessari i diritti di accesso appropriati per le chiavi di registro.

Non utilizzo gli strumenti assoc e ftype poiché preferisco usare RegEdit in modalità interattiva o batch, ma da altri commenti sembra che funzionino solo sull'hive HKLM e siano inutili per cancellare / impostare le chiavi HKCU. Prenditi del tempo e sfoglia le chiavi sopra menzionate con RegEdit per vedere altri esempi.


HKCR non funziona come credi. In HKCR, ho una voce "sourcecode". "sourcecode" non esiste in HKLM \ Software \ Classes. D'altra parte, in HKCU \ Software \ Classes è presente "codice sorgente". Quindi, ovviamente, HKCR include voci da HKCU \ Software \ Classes. D'altra parte, sia in HKCR che in HKLM sono presenti "SoundRec" e "SPCFile". Ma HKCU \ Software \ Classes non ha questi. Pertanto, HKCR include ovviamente anche voci da HKLM. HKCR sta sicuramente fondendo le due sedi in qualche modo. Vedi anche superuser.com/a/266274
Ben
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.