Τι σημαίνει %~dp0 και πώς λειτουργεί;

Βρίσκω το %~dp0 πολύ χρήσιμο και το χρησιμοποιώ συχνά για να κάνω τα αρχεία batch μου πιο φορητά.

Αλλά η ίδια η ετικέτα μου φαίνεται πολύ αινιγματική... Τι κάνει το ~; Το dp σημαίνει δίσκος και διαδρομή; Μήπως το 0 αναφέρεται στο %0, τη διαδρομή προς το αρχείο δέσμης που περιλαμβάνει το όνομα του αρχείου;

Ή είναι απλά μια περίεργη ετικέτα;

Θα ήθελα επίσης να ξέρω αν πρόκειται για ένα τεκμηριωμένο χαρακτηριστικό ή για κάτι που τείνει να καταργηθεί.

Λύση

Καλώντας

for /?

στη γραμμή εντολών δίνει βοήθεια σχετικά με αυτή τη σύνταξη (η οποία μπορεί να χρησιμοποιηθεί και εκτός FOR, αυτό είναι απλά το μέρος όπου μπορεί να βρεθεί η βοήθεια).

Επιπλέον, η αντικατάσταση της FOR

των αναφορών μεταβλητών έχει βελτιωθεί. Μπορείτε τώρα να χρησιμοποιήσετε την ακόλουθη προαιρετική σύνταξη: &gt, %~I - επεκτείνει το %I αφαιρώντας τυχόν περιβάλλοντα εισαγωγικά (") %~fI - επεκτείνει το %I σε ένα πλήρως προσδιορισμένο όνομα διαδρομής %~dI - επεκτείνει το %I μόνο σε γράμμα μονάδας δίσκου %~pI - επεκτείνει το %I μόνο σε διαδρομή %~nI - επεκτείνει το %I μόνο σε όνομα αρχείου %~xI - επεκτείνει το %I μόνο σε επέκταση αρχείου %~sI - η διευρυμένη διαδρομή περιέχει μόνο σύντομα ονόματα %~aI - επεκτείνει το %I σε χαρακτηριστικά αρχείου του αρχείου %~tI - επεκτείνει το %I σε ημερομηνία/ώρα του αρχείου %~zI - επεκτείνει το %I στο μέγεθος του αρχείου %~$PATH:I - αναζητά τους καταλόγους που αναφέρονται στο PATH μεταβλητή περιβάλλοντος και επεκτείνει το %I στο πλήρως προσδιορισμένο όνομα του πρώτου που βρέθηκε. Εάν το όνομα της μεταβλητής περιβάλλοντος δεν είναι οριστεί ή το αρχείο δεν έχει βρεθεί από την εντολή αναζήτηση, τότε αυτός ο τροποποιητής επεκτείνεται στο κενή συμβολοσειρά &gt, Οι τροποποιητές μπορούν να συνδυαστούν για να πάρουμε σύνθετα αποτελέσματα: &gt, %~dpI - επεκτείνει το %I μόνο σε γράμμα δίσκου και διαδρομή %~nxI - επεκτείνει το %I μόνο σε όνομα αρχείου και επέκταση %~fsI - επεκτείνει το %I σε ένα πλήρες όνομα διαδρομής μόνο με σύντομα ονόματα %~dp$PATH:I - αναζητά τους καταλόγους που αναφέρονται στο PATH μεταβλητή περιβάλλοντος για το %I και επεκτείνει στο γράμμα μονάδας δίσκου και τη διαδρομή του πρώτου που βρέθηκε. %~ftzaI - επεκτείνει το %I σε μια γραμμή εξόδου τύπου DIR &gt, Στα παραπάνω παραδείγματα οι %I και PATH μπορούν να αντικατασταθεί από άλλες έγκυρες τιμές. Η σύνταξη %~ τερματίζεται από μια έγκυρη όνομα μεταβλητής FOR. Επιλογή κεφαλαίων χαρακτήρων ονόματα μεταβλητών όπως το %I το κάνει πιο ευανάγνωστο και αποφεύγεται η σύγχυση με το τροποποιητές, οι οποίοι δεν έχουν πεζά γράμματα ευαίσθητα.

Υπάρχουν διαφορετικά γράμματα που μπορείτε να χρησιμοποιήσετε όπως f για "πλήρες όνομα διαδρομής", d για γράμμα δίσκου, p για διαδρομή, και μπορούν να συνδυαστούν. Το %~ είναι η αρχή για κάθε μία από αυτές τις ακολουθίες και ένας αριθμός I δηλώνει ότι λειτουργεί με την παράμετρο %I (όπου %0 είναι το πλήρες όνομα του αρχείου δέσμης, όπως ακριβώς υποθέσατε).

Σχόλια (5)

(Πρώτον, θα ήθελα να συστήσω αυτόν τον χρήσιμο ιστότοπο αναφοράς για την παρτίδα: http://ss64.com/nt/)

Στη συνέχεια, άλλη μια χρήσιμη εξήγηση: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

Η μεταβλητή %~dp0

&gt, Η μεταβλητή %~dp0 (που είναι ένα μηδέν) όταν αναφέρεται μέσα σε ένα Windows θα επεκταθεί στο γράμμα drive και path του εν λόγω αρχείου δέσμης αρχείο. &gt, Οι μεταβλητές %0-%9 αναφέρονται στις παραμέτρους της γραμμής εντολών του αρχείου batch αρχείο. %1-%9 αναφέρονται στα ορίσματα της γραμμής εντολών μετά το όνομα του αρχείου δέσμης. %0 αναφέρεται στο ίδιο το αρχείο δέσμης. &gt, Εάν ακολουθήσετε τον χαρακτήρα του ποσοστού (%) με έναν χαρακτήρα tilde (~), μπορείτε να εισαγάγετε έναν τροποποιητή(-ές) πριν από τον αριθμό της παραμέτρου για να αλλάξετε την τον τρόπο με τον οποίο αναπτύσσεται η μεταβλητή. Ο τροποποιητής d επεκτείνεται στη μονάδα δίσκου γράμμα και ο τροποποιητής p επεκτείνεται στη διαδρομή της παραμέτρου. &gt, Παράδειγμα: Έστω ότι έχετε έναν κατάλογο στο C: που ονομάζεται bat_files, και σε αυτόν τον κατάλογο υπάρχει ένα αρχείο που ονομάζεται example.bat. Σε αυτή την περίπτωση, %~dp0 (συνδυάζοντας τους τροποποιητές d και p) θα επεκταθεί στο C:\bat_files. &gt, Δείτε αυτό το άρθρο της Microsoft για μια πλήρη εξήγηση. &gt, Επίσης, ελέγξτε αυτό το νήμα του φόρουμ.

Και μια πιο σαφή αναφορά από εδώ:

  • Το %CmdCmdLine% θα επιστρέψει ολόκληρη τη γραμμή εντολών όπως έχει περάσει στο CMD.EXE

  • Το %* θα επιστρέψει το υπόλοιπο της γραμμής εντολών ξεκινώντας από το πρώτο όρισμα της γραμμής εντολών (στα Windows NT 4, το %* περιλαμβάνει επίσης όλα τα κενά στην αρχή).

  • %~dn θα επιστρέψει το γράμμα μονάδας δίσκου του %n (το n μπορεί να κυμαίνεται από 0 έως 9) εάν το %n είναι έγκυρη διαδρομή ή όνομα αρχείου (όχι UNC)

  • %~pn θα επιστρέψει τον κατάλογο του %n αν το %n είναι έγκυρη διαδρομή ή όνομα αρχείου (όχι UNC)

  • %~nn θα επιστρέψει μόνο το όνομα αρχείου του %n αν το %n είναι έγκυρο όνομα αρχείου

  • %~xn θα επιστρέψει την επέκταση αρχείου μόνο του %n αν το %n είναι έγκυρο όνομα αρχείου

  • %~fn θα επιστρέψει την πλήρως χαρακτηρισμένη διαδρομή του %n εάν το %n είναι έγκυρο όνομα αρχείου ή κατάλογος.

ADD 1

Μόλις βρήκα κάποια καλή αναφορά για τον μυστηριώδη τελεστή ~ tilde.

Η συμβολοσειρά %~ ονομάζεται τελεστής percent tilde. Μπορείτε να τον βρείτε σε περιπτώσεις όπως: - Ο τελεστής τελενδίου είναι ένας από τους πιο σημαντικούς τελεστές που υπάρχουν: %~0.

Η συμβολοσειρά :~ ονομάζεται τελεστής τελεία τελεία. Μπορείτε να τον βρείτε όπως: %SOME_VAR:~0,-1%.

ADD 2 - 1:12 PM 7/6/2018

Τα %1-%9 αναφέρονται στα args της γραμμής εντολών. Αν είναι μη έγκυρες τιμές διαδρομής, τα %~dp1 - %~dp9 θα επεκταθούν όλα στην ίδια τιμή με την %~dp0. Αλλά αν είναι έγκυρες τιμές διαδρομής, θα επεκταθούν στη δική τους τιμή οδηγού/διαδρομής.

Για παράδειγμα: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Εκτέλεση 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Εκτέλεση 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
Σχόλια (3)

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

Η μεταβλητή %0 σε ένα σενάριο δέσμης ορίζεται στο όνομα του αρχείου δέσμης που εκτελείται. Η ειδική σύνταξη ~dp μεταξύ του % και του 0 ουσιαστικά λέει να επεκτείνετε τη μεταβλητή %0 ώστε να εμφανιστεί το γράμμα του δίσκου και η διαδρομή, η οποία σας δίνει τον τρέχοντα κατάλογο που περιέχει το αρχείο δέσμης!

Σχόλια (2)