Βρίσκω το %~dp0
πολύ χρήσιμο και το χρησιμοποιώ συχνά για να κάνω τα αρχεία batch μου πιο φορητά.
Αλλά η ίδια η ετικέτα μου φαίνεται πολύ αινιγματική... Τι κάνει το ~
; Το dp
σημαίνει δίσκος και διαδρομή; Μήπως το 0
αναφέρεται στο %0
, τη διαδρομή προς το αρχείο δέσμης που περιλαμβάνει το όνομα του αρχείου;
Ή είναι απλά μια περίεργη ετικέτα;
Θα ήθελα επίσης να ξέρω αν πρόκειται για ένα τεκμηριωμένο χαρακτηριστικό ή για κάτι που τείνει να καταργηθεί.
Καλώντας
for /?
στη γραμμή εντολών δίνει βοήθεια σχετικά με αυτή τη σύνταξη (η οποία μπορεί να χρησιμοποιηθεί και εκτός FOR, αυτό είναι απλά το μέρος όπου μπορεί να βρεθεί η βοήθεια).
Επιπλέον, η αντικατάσταση της FOR
των αναφορών μεταβλητών έχει βελτιωθεί. Μπορείτε τώρα να χρησιμοποιήσετε την ακόλουθη προαιρετική σύνταξη: >, %~I - επεκτείνει το %I αφαιρώντας τυχόν περιβάλλοντα εισαγωγικά (") %~fI - επεκτείνει το %I σε ένα πλήρως προσδιορισμένο όνομα διαδρομής %~dI - επεκτείνει το %I μόνο σε γράμμα μονάδας δίσκου %~pI - επεκτείνει το %I μόνο σε διαδρομή %~nI - επεκτείνει το %I μόνο σε όνομα αρχείου %~xI - επεκτείνει το %I μόνο σε επέκταση αρχείου %~sI - η διευρυμένη διαδρομή περιέχει μόνο σύντομα ονόματα %~aI - επεκτείνει το %I σε χαρακτηριστικά αρχείου του αρχείου %~tI - επεκτείνει το %I σε ημερομηνία/ώρα του αρχείου %~zI - επεκτείνει το %I στο μέγεθος του αρχείου %~$PATH:I - αναζητά τους καταλόγους που αναφέρονται στο PATH μεταβλητή περιβάλλοντος και επεκτείνει το %I στο πλήρως προσδιορισμένο όνομα του πρώτου που βρέθηκε. Εάν το όνομα της μεταβλητής περιβάλλοντος δεν είναι οριστεί ή το αρχείο δεν έχει βρεθεί από την εντολή αναζήτηση, τότε αυτός ο τροποποιητής επεκτείνεται στο κενή συμβολοσειρά >, Οι τροποποιητές μπορούν να συνδυαστούν για να πάρουμε σύνθετα αποτελέσματα: >, %~dpI - επεκτείνει το %I μόνο σε γράμμα δίσκου και διαδρομή %~nxI - επεκτείνει το %I μόνο σε όνομα αρχείου και επέκταση %~fsI - επεκτείνει το %I σε ένα πλήρες όνομα διαδρομής μόνο με σύντομα ονόματα %~dp$PATH:I - αναζητά τους καταλόγους που αναφέρονται στο PATH μεταβλητή περιβάλλοντος για το %I και επεκτείνει στο γράμμα μονάδας δίσκου και τη διαδρομή του πρώτου που βρέθηκε. %~ftzaI - επεκτείνει το %I σε μια γραμμή εξόδου τύπου DIR >, Στα παραπάνω παραδείγματα οι %I και PATH μπορούν να αντικατασταθεί από άλλες έγκυρες τιμές. Η σύνταξη %~ τερματίζεται από μια έγκυρη όνομα μεταβλητής FOR. Επιλογή κεφαλαίων χαρακτήρων ονόματα μεταβλητών όπως το %I το κάνει πιο ευανάγνωστο και αποφεύγεται η σύγχυση με το τροποποιητές, οι οποίοι δεν έχουν πεζά γράμματα ευαίσθητα.
Υπάρχουν διαφορετικά γράμματα που μπορείτε να χρησιμοποιήσετε όπως f
για "πλήρες όνομα διαδρομής", d
για γράμμα δίσκου, p
για διαδρομή, και μπορούν να συνδυαστούν. Το %~
είναι η αρχή για κάθε μία από αυτές τις ακολουθίες και ένας αριθμός I
δηλώνει ότι λειτουργεί με την παράμετρο %I
(όπου %0
είναι το πλήρες όνομα του αρχείου δέσμης, όπως ακριβώς υποθέσατε).
(Πρώτον, θα ήθελα να συστήσω αυτόν τον χρήσιμο ιστότοπο αναφοράς για την παρτίδα: http://ss64.com/nt/)
Στη συνέχεια, άλλη μια χρήσιμη εξήγηση: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/
Η μεταβλητή %~dp0
>, Η μεταβλητή %~dp0 (που είναι ένα μηδέν) όταν αναφέρεται μέσα σε ένα Windows θα επεκταθεί στο γράμμα drive και path του εν λόγω αρχείου δέσμης αρχείο. >, Οι μεταβλητές %0-%9 αναφέρονται στις παραμέτρους της γραμμής εντολών του αρχείου batch αρχείο. %1-%9 αναφέρονται στα ορίσματα της γραμμής εντολών μετά το όνομα του αρχείου δέσμης. %0 αναφέρεται στο ίδιο το αρχείο δέσμης. >, Εάν ακολουθήσετε τον χαρακτήρα του ποσοστού (%) με έναν χαρακτήρα tilde (~), μπορείτε να εισαγάγετε έναν τροποποιητή(-ές) πριν από τον αριθμό της παραμέτρου για να αλλάξετε την τον τρόπο με τον οποίο αναπτύσσεται η μεταβλητή. Ο τροποποιητής d επεκτείνεται στη μονάδα δίσκου γράμμα και ο τροποποιητής p επεκτείνεται στη διαδρομή της παραμέτρου. >, Παράδειγμα: Έστω ότι έχετε έναν κατάλογο στο C: που ονομάζεται bat_files, και σε αυτόν τον κατάλογο υπάρχει ένα αρχείο που ονομάζεται example.bat. Σε αυτή την περίπτωση, %~dp0 (συνδυάζοντας τους τροποποιητές d και p) θα επεκταθεί στο C:\bat_files. >, Δείτε αυτό το άρθρο της Microsoft για μια πλήρη εξήγηση. >, Επίσης, ελέγξτε αυτό το νήμα του φόρουμ.
Και μια πιο σαφή αναφορά από εδώ:
Το %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 είναι έγκυρο όνομα αρχείου ή κατάλογος.
Μόλις βρήκα κάποια καλή αναφορά για τον μυστηριώδη τελεστή ~
tilde.
Η συμβολοσειρά %~
ονομάζεται τελεστής percent tilde. Μπορείτε να τον βρείτε σε περιπτώσεις όπως: - Ο τελεστής τελενδίου είναι ένας από τους πιο σημαντικούς τελεστές που υπάρχουν: %~0
.
Η συμβολοσειρά :~
ονομάζεται τελεστής τελεία τελεία. Μπορείτε να τον βρείτε όπως: %SOME_VAR:~0,-1%
.
Τα %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\
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true
Η μεταβλητή %0
σε ένα σενάριο δέσμης ορίζεται στο όνομα του αρχείου δέσμης που εκτελείται. Η ειδική σύνταξη ~dp
μεταξύ του %
και του 0
ουσιαστικά λέει να επεκτείνετε τη μεταβλητή %0
ώστε να εμφανιστεί το γράμμα του δίσκου και η διαδρομή, η οποία σας δίνει τον τρέχοντα κατάλογο που περιέχει το αρχείο δέσμης!