2009-11-25 11 views
5

Sto provando a scrivere uno script in PowerShell per convertire in batch i file video.Comportamento test path in PowerShell

Il modo in cui intendo utilizzarlo è andare in una cartella piena di file video ed eseguirla. Utilizza un programma di conversione che può essere eseguito in "modalità riga di comando" (denominato freno a mano) e salva i file convertiti con "-android" aggiunto prima dell'estensione del file. Per esempio, se ho un file chiamato video1.avi nella cartella, dopo aver eseguito lo script la cartella ha 2 file: video1.avi e video1-android.avi

Il motivo per cui voglio farlo in questo modo è così che posso verificare se, per ogni file video, c'è una versione convertita di esso (con -android aggiunto al nome). E se è così, salta la conversione per quel file.

E questo è dove mi sto divertendo. Il problema è il comportamento del percorso di test (il cmdlet che sto utilizzando per verificare se esiste un file).

Quello che succede è se il file video ha un nome "insolito" (ad esempio nel mio caso è video [lungo] .avi) Test-Path restituisce sempre False se si tenta di verificare se quel file esiste.

Un modo semplice per testare questo è per esempio per fare questo:

Vai in una cartella vuota, corsa Blocco note per creare un file con "[" nel suo nome:

&notepad test[x].txt 

Salvare il file

quindi fare questo:

Get-ChildItem | ForEach-Object {Test-Path $_.FullName} 

lo fa non restituire vero! Dovrebbe giusto? Beh, non succede se il file ha "[" nel suo nome (non ho controllato nessun altro carattere speciale)

Ho capito che se si esce da "[" e "]" funziona

Test-Path 'test`[x`].txt' 

restituisce true.

Come posso aggirare questo problema? Voglio essere in grado di: dato un BaseName di un file, aggiungilo "-android.avi" e controlla se esiste un file con quel nome.

Grazie, Rui

risposta

8

Molti cmdlet di PowerShell hanno parametri di percorso che supportano caratteri jolly. Come hai osservato, in PowerShell non solo è * un carattere jolly ma [ e ] sono considerati anche caratteri jolly. Puoi leggere ulteriori informazioni al riguardo nell'argomento della guida about_Wildcards.

Per il tuo problema, se non hai bisogno di caratteri jolly, ti consigliamo di utilizzare il parametro -LiteralPath. Questo parametro non supporta caratteri jolly e accetta [ e ] caratteri letterali percorso come ad esempio:

Get-ChildItem | ForEach {Test-Path -LiteralPath ` 
         "$([io.path]::ChangeExtension($_.FullName,'avi'))"} 

Cordiali saluti, il motivo per pipe l'output di Get-ChildItem direttamente nel Test-Path funziona è perché il parametro LiteralPath ha un alias "PSPath" che si associa alla proprietà PSPath sull'output dell'oggetto FileInfo da Get-ChildItem.Quella proprietà viene associata al parametro LiteralPath (er PSPath) "in base al nome della proprietà".

+0

Grazie, era esattamente ciò di cui avevo bisogno – Rui

1
dir | % {test-path "$($_.Name)-android.avi"} 
+1

Potete approfondire, perché $ ($ _. Name) e "% {}"? – Rui

+1

'%' e 'Foreach' sono alias per il cmdlet Forech-Object. All'interno di una stringa, puoi eseguire semplici espansioni di variabili come "$ _", ma se vuoi valutare un'espressione come accedere a una proprietà di un oggetto, devi usare una sottoespressione, ad es. ' "$ ($ _. Name)"'. –

Problemi correlati