2011-05-04 12:54:50 +0000 2011-05-04 12:54:50 +0000
92
92

Hoe kan ik in Windows ontsnappen aan spaties in de opdrachtregel zonder gebruik te maken van aanhalingstekens?

Bijvoorbeeld wat is het alternatief voor dit commando zonder aanhalingstekens:

CD "c:\Documents and Settings"

De volledige reden dat ik geen aanhalingstekens wil gebruiken is dat dit commando werkt:

SVN add mypathname\*.*

maar dit commando werkt NIET :

SVN add "mypathname\*.*"

Het probleem is dat wanneer ik mijn mijn naam verander voor een pad met spaties erin, ik het hele ding moet aanhalen. Bijvoorbeeld:

SVN add "c:\Documents and Settings\username\svn\*.*"

Maar als ik dit probeer krijg ik de volgende foutmelding:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

Antwoorden (7)

59
59
59
2011-05-04 16:59:54 +0000

Het werkt bijna allemaal voor mij, maar heb je misschien regel5 geprobeerd… de ruimte te ontvluchten met een caret-symbool (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

of b.v. hieronder waar de caret echt het verschil maakt.

lijkt erop dat het caret-symbool van onderaf je antwoord kan zijn, zie regel 3 hieronder.

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>
36
36
36
2013-04-24 07:45:18 +0000

Ik vond dat citaten rond slechts een deel van de locatie werken. In uw geval:

SVN add C:\"Documents and Settings"\username\svn\*.*

Hoewel dit aanhalingstekens gebruikt, is het belangrijk om op te merken dat de sterretjes _buiten de aanhalingstekens staan, dus ze functioneren nog steeds correct.

26
26
26
2015-08-26 02:01:44 +0000

Ondanks de antwoorden die de illusie wekken dat het werkt, is het een feit dat je niet in de gebruikelijke cmd-argumenten kunt sluipen. Dit is gemakkelijk te bewijzen:

  1. Sla “echo %1” op als test.bat. Dit batch-bestand zal het eerste argument dat cmd ons passeert uitvoeren.

  2. Probeer nu test.bat uit te voeren en stel de waarde van %1 in op foo bar. (Merk op dat er een spatiegrafiek is tussen foo en bar.)

    1. Probeer het een paar jaar lang en realiseer je dat er geen manier is om het te doen. Mensen zullen suggereren om te ontsnappen met behulp van ^, maar test.bat foo^ bar zal foo bar niet uitvoeren.

Dus, er is geen manier om de uitvoer foo bar te krijgen, en het dichtstbijzijnde wat we kunnen krijgen is draaiende test.bat foo" "bar die foo" "bar produceert, of draaiende test.bat "foo bar" die "foo bar" produceert.

  • *

Nu, de reden dat de andere antwoorden verschijnen te werken is omdat cd het eigen extra parseren doet, afwijkend van het gedrag van het gebruikelijke passeren van argumenten (het gebruikelijke %1, %2, %3 en etc in typische batch-bestanden).

Bijvoorbeeld, denk aan het eigenaardige commando:

cd c:\documents and settings \some folder with spaces

Waarom werkt het? Dit komt doordat cd ** zichzelf** iets gelijkwaardigs doet aan het samenvoegen van de 7 gebruikelijke argumenten tot één logische. Volgens cmd argument passerende normen zien we 7 argumenten:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces
  8. cd

Het is alsof array.join(" ") alle 7 argumenten heeft samengevoegd tot één logische, die iets doet met cd, wat het pad produceert:

c:\documents and settings \some folder with spaces

Noteer dat dit gedrag specifiek is voor cd alleen (en enkele andere functies). Het heeft niets te maken met de gebruikelijke argumentatie die voorbijgaat.

  • *

Inderdaad, foo bar heeft nog een andere eigenaardigheid. Weet je nog dat we hierboven zeiden dat we de uitgang foo" "bar niet konden krijgen? De dichtstbijzijnde output die we kunnen krijgen is door te draaien:

test.bat foo" "bar

die "foo bar" produceert, of:

test.bat "foo bar"

die "foo "bar produceert, of:

test.bat "foo "bar

die foo" bar" produceert, of:

test.bat foo" bar"

die "foo b"ar produceert, of:

test.bat "foo b"ar

die fo"o bar" produceert, of:

test.bat fo"o bar"

die fo"o ba"r produceert, of:

test.bat fo"o ba"r

die "fo"o" bar" produceert, of:

test.bat "fo"o" bar"

die "f""o""o"" ""b""a""r" produceert, of: test.bat "f""o""o"" ""b""a""r":

die """"f"""o""""o"" ""ba"""r"""""""""" produceert, of zelfs:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

die foo bar produceert.

Alle bovenstaande voorbeelden hebben één overeenkomst, namelijk dat ze " produceren nadat we de cd chars hebben afgeknipt. cd‘s auteur moet zich dit ook gerealiseerd hebben… als we uit "’s eigenaardige gedrag zouden afleiden dat ** alle cd c:\documents and settings die het ontvangt afknipte** , waardoor al deze commando’s kunnen werken:

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs

  • &007

  • &007

  • &007

8
8
8
2014-04-19 07:51:15 +0000

De korte filmnaam lijkt te werken als een makkie.

“E:Progra~1JavaEclipseeclipse.exe” -vmargs -Xms1024m -Xmx2048m

Voor het opvoeren van het geheugen… ;)

3
3
3
2012-10-03 14:47:56 +0000

Gebruik de 8.3 korte filmnaam. Bijvoorbeeld:

If exist c:\docume~1 goto :Ifoundthesucker
2
2
2
2017-05-12 08:43:24 +0000

Voor degenen die het hebben over 8.3 vervanging, let op de volgende twee dingen:

  • 8.3 kan worden ingesteld op uitgeschakeld (of ingeschakeld) op NTFS, dus het kan niet altijd bestaan.
  • De 8.3 naam van een bestand/map kan zonder voorafgaande kennisgeving worden gewijzigd, alleen door het creëren, hernoemen of verwijderen van andere dingen in dezelfde map.

Dus c:\docume~1 kan wijzen op:

  • Nergens (ongeldig)
  • De gewenste map
  • Een andere map
  • Een variabele map in de tijd

Het is niet veilig, tenzij je de korte naam krijgt en deze gebruikt in atoombewerkingen.

Hoewel het zeer ongebruikelijk is dat ze veranderen, is het gebruikelijk dat ze niet bestaan.

Als je wilt weten of 8.3 bestaat voor een bepaalde map/bestand, test het dan met parameter /X op een dir commando, of inkapsel het op een for om alleen dat deel te krijgen, etc.

Voor meer informatie over hoe je 8.3 op NTFS kunt in-/uitschakelen, zie dit Microsoft ondersteuningsartikel: https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions

0
0
0
2019-08-08 20:42:46 +0000

In navolging van @Pang’s post, en anderen die korte namen en de valkuilen bespreken, is hier de manier om dynamisch een lange naam op te lossen in een korte naam:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Dan kun je natuurlijk de korte naam gebruiken in plaats van de omringende aanhalingstekens.