2012-08-23 37 views
12

Llamo a powershell desde una aplicación Java (a través del símbolo del sistema de Windows) para leer varios atributos de archivos.¿Cómo acceder a las rutas de archivos en Powershell que contienen caracteres especiales?

p. Ej.

powershell (get-item 'C:\Users\erlpm\Desktop\Temp\s p a c e s.txt').creationTime 

Adjunto la ruta del archivo entre comillas simples, porque puede contener espacios. Funcionó bien, hasta que encontré una ruta de archivo que contenía corchetes, que parecen interpretarse como un carácter comodín. Me las arreglé para resolver añadiendo el parámetro -LiteralPath:

powershell (get-item -literalpath 'C:\Users\erlpm\Desktop\Temp\brackets[].txt').creationTime 

Hasta ahora, todo bien ... Pero rutas de archivos también pueden contener comillas simples, signos de dólar símbolos de unión, ... y todos estos los caracteres parecen tener una función específica en powershell para la cual el parámetro -literalPath parece no funcionar. Intenté adjuntar la ruta con comillas dobles o escapé con el carácter `, pero eso tampoco solucionó mi problema :-(

Cualquier sugerencia sobre cómo pasar una ruta de archivo a Powershell que puede contener espacios, comillas simples, corchetes, los símbolos de unión, signos de dólar, etc.

cambio:? Alguien de aquí ya me mostró cómo conseguir que funcione dentro de Powershell, pero de alguna manera la respuesta ha sido eliminado
de todos modos, lo hice crea un archivo llamado $ & ' [].txt. Esto funciona dentro Powershell (necesario para escapar de la &):

PS C:\Users\erlpm> Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 


    Directory: C:\Users\erlpm\Desktop\Temp 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  2012-08-23  14:22   0 $ & ' [].txt 

Pero cuando ejecuto el mismo sistema de PowerShell a través del símbolo del sistema de Windows, ...

C:\Users\erlpm>powershell Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 

... me sale este error :

Ampersand not allowed. The & operator is reserved for future use; use "&" to pass ampersand as a string. 
At line:1 char:55 
+ Get-Item -LiteralPath C:\Users\erlpm\Desktop\Temp\`$ & <<<< ' [].txt 
    + CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : AmpersandNotAllowed 

Utilizando el parámetro -command y poniendo el comando PowerShell entre {} da exactamente el mismo mensaje de error ...

C:\Users\erlpm>powershell -command {Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"} 
+0

Podría dar algunos ejemplos de caminos que no están funcionando, y el error exacto se obtiene? Hasta ahora, solo ha proporcionado rutas de trabajo, por lo que es difícil saber dónde está el problema. – latkin

+0

Actualicé mi pregunta y agregué algunos ejemplos que funcionan y que no funcionan. Como puede ver, puedo hacer que funcione desde el prompt de Powershell, pero no ejecutando powershell desde el símbolo del sistema de Windows. –

+0

He reproducido su problema creando un archivo llamado "$ * '[] .txt". Luego, desde un mensaje de Powershell, escribí el artículo get y powershell completó el nombre de archivo para mí, pero no puedo pegar aquí el nombre completo porque markdown come todos los caracteres especiales. Pruébalo y ve si eso ayuda. – joXn

Respuesta

7

Si usted puede escribir la ruta de acceso a un archivo txt temporal, las siguientes obras: OK

(get-item -literalpath (gc 'C:\Temp\path.txt')).creationTime 

El archivo @ C: \ Temp \ ruta .txt contiene la ruta con caracteres especiales, aparte de esto, creo que tendrías que escapar de cada carácter especial por ruta.

Además del hack anterior, parece que Powershell V3 puede ayudar aquí con la adición de una nueva función de lenguaje de "parámetros mágicos". En concreto, véase la sección titulada 'Más fácil reutilización de líneas de comandos De cmd.exe' here y porque odio enlace-rot, aquí está, sin vergüenza reproduce a continuación:

más fácil reutilización de líneas de comandos De Cmd.exe

La web está llena de líneas de comando escritas para Cmd.exe. Estas líneas de comandos funcionan con la suficiente frecuencia en PowerShell, pero cuando incluyen ciertos caracteres , p. un punto y coma (;) un signo de dólar ($) o llaves, tiene que hacer algunos cambios, probablemente agregando algunas comillas. Este parece ser la fuente de muchos dolores de cabeza menores.

Para ayudar a abordar este escenario, agregamos una nueva forma de "escanear" el análisis de las líneas de comando. Si usa un parámetro mágico -%, detenemos nuestro análisis normal de su línea de comando y cambiamos a algo mucho más simple . No hacemos coincidir las comillas. No nos detenemos en el punto y coma. Nosotros no expandimos las variables de PowerShell. Sí expandimos las variables de entorno si usa la sintaxis Cmd.exe (por ejemplo,% TEMP%). Aparte de eso, los argumentos hasta el final de la línea (o tubería, si está tubería) son pasados ​​tal como están. Aquí está un ejemplo:

echoargs.exe --% %USERNAME%,this=$something{weird} 
Arg 0 is <jason,this=$something{weird}> 
8

Esta es realmente una pregunta sobre cmd.exe cadena de escapar, a continuación. La combinación de cmd y escape de cadena powershell es una pesadilla total. Después de bastantes intentos, conseguí que tu ejemplo específico funcionara:

C:\Users\latkin>powershell.exe -nologo -noprofile -command ^&{ dir -LiteralPath ^"""".\`$ & ' [].txt"" } 

    Directory: C:\Users\latkin 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   8/23/2012 8:46 AM   0 $ & ' [].txt 

Totalmente intuitivo, ¿verdad?

Puedes pasar 15 minutos luchando con secuencias de escape cada vez, o puedes probar algunos otros appraoches.

Ponga el nombre del archivo en un archivo de texto y léalo de allí.

C:\> powershell.exe -command "&{dir -literal (gc .\filename.txt) }" 

o

Utilice un guión

C:\> powershell.exe -file .\ProcessFiles.ps1 # in processfiles.ps1 you are in fully powershell environment, so escaping is easier 

o

Uso -EncodedCommand

Ver powershell.exe -? (último elemento mostrado) o http://dmitrysotnikov.wordpress.com/2011/07/06/passing-parameters-to-encodedcommand/

+0

Como sugirió, dejé de intentar escapar de los caracteres especiales y escribí el archivo en un archivo temporal. Esto parece que funciona bien ! –

2

Este hilo tiene 5 años de antigüedad así que tal vez los tiempos han cambiado, pero la respuesta actual que funcionó para mí fue usar el símbolo de metedura de pata (`) para escapar del carácter especial.

En mi caso, era un signo de dólar en una ruta de directorio que estaba fallando. Al poner un backtick antes del signo de dólar, todo funcionó.

Antes:

$dir = "C:\folder$name\dir" # failed 

Después:

$dir = "C:\folder`$name\dir" # succeeded 
+0

en 2017 backtick funciona a la perfección –

Cuestiones relacionadas