Configurar la siguiente variable $usbDriveLetter para encontrar automáticamente la letra de la unidad USB y usar esa variable para abrir una imagen en el USB no funciona. Literalmente imprime "G: \ image.png" en el cmd.

$usbDriveLetter = (gwmi win32_volume -f 'label=''USB_NAME_HERE''').Name;
"$usbDriveLetter" + "image.png"

Pero si no uso una var y hago "G: \" estático en el script de PowerShell, la imagen se abre sin problemas.

G:\image.png

Entonces, ¿qué estoy haciendo mal aquí? ¿Cómo abrimos imágenes dinámicamente usando scripts de ps1?

2
puqaw 19 feb. 2018 a las 22:23

2 respuestas

La mejor respuesta

Cuando se combinan dos cadenas, se obtiene una cadena. Si cita la ruta ("G:\image.png") se comportará igual.

Utilice Invoke-Item para ejecutar la ruta:

$usbDriveLetter = (gwmi win32_volume -f 'label=''USB_NAME_HERE''').Name
Invoke-Item -Path ("$usbDriveLetter" + "image.png")

También puede utilizar el operador de llamada &:

$usbDriveLetter = (gwmi win32_volume -f 'label=''USB_NAME_HERE''').Name
& ("$usbDriveLetter" + "image.png")
2
Frode F. 19 feb. 2018 a las 19:30

La útil respuesta de Frode F. ofrece soluciones eficaces.

En cuanto a cuándo necesitas & , el operador de llamadas de PowerShell:

Para ejecutar un comando / abrir un documento que no está especificado como una cadena literal sin comillas , necesita & .

Es decir, & es necesario siempre que especifique el nombre del comando (o ruta) / nombre de archivo del documento (o ruta):

  • ya sea: como una cadena entre comillas (p. ej., "G:\image.png")

  • o: como resultado de una expresión (p. ej., ("$usbDriveLetter" + "image.png"); lo mismo para $(...))

Nota:

  • En el caso de abrir un documento (en lugar de invocar un ejecutable), puede usar Invoke-Item en lugar de &.

  • Si está intentando abrir una ruta de carpeta en el Explorador de archivos, solo Invoke-Item funciona.


En cuanto a por qué necesitas & :

PowerShell tiene dos modos de análisis fundamentales :

  • argumento modo , que funciona como los tradicionales shells

  • Modo expresión , que funciona como los lenguajes de programación tradicionales.

Ejecutando Get-help about_Parsing proporciona una introducción a estos modos.

En resumen, es el primer token que determina qué modo se aplica , y para ejecutar / abrir algo, debe ser analizado en modo argumento (en modo expresión , el resultado es simplemente salida ); por lo tanto, el primer token debe ser:

  • ya sea: un nombre de comando / documento literal, sin comillas, o una ruta, como se indica.
  • o: &, en cuyo caso el siguiente argumento, que luego puede especificarse como una cadena o expresión entre comillas, se interpreta como el comando / nombre del documento o la ruta para ejecutar / abrir.
1
mklement0 19 feb. 2018 a las 22:42