5

मेरे पास एक परिनियोजन स्क्रिप्ट है जिसमें मुझे सीडीडी पैरामीटर के रूप में एलडीएपी पासवर्ड पास करना होगा।मुझे कमांडलाइन तर्क के रूप में पासवर्ड (विशेष वर्ण युक्त) कैसे पास करना चाहिए?

वास्तविक पासवर्ड:

जैसे

...bin>deployment.bat LDAPPassword= foo\$ser\"ver\\ 1 

नोट:  foo\$ser"ver\\ 1  (1 से पहले शुरुआत में, और उसके बाद 1 तीन अंतरिक्ष वर्ण हैं): वहाँ पासवर्ड में रिक्त स्थान के रूप में शुरुआत में दिखाए गए हैं ।

deployment.bat एक कक्षा को कॉल करता है जिस पर उपर्युक्त पैरामीटर एक तर्क के रूप में पारित किया जाता है। समस्या यह है कि वर्ग 2 अलग तर्क प्राप्त करता है:

args[0]= foo\$ser"ver\\   //The space after \\ is omitted 
args[1]=1       //The space before and after 1 is omitted 

इतना है कि यह एक स्ट्रिंग के रूप में प्राप्त होता है मैं इस पासवर्ड को पारित करते हैं?

मैं पहले से ही के रूप में

...bin>deployment.bat LDAPPassword=" foo\$ser"ver\\ 1 " 

पासवर्ड के हवाले लेकिन यह काम नहीं करेगा कोशिश की है।

+1

पर दिखाई दे सकता है अधिक जानकारी के लिए कोड प्रदान करें –

+0

बजाय '% *' – Alex

+0

शायद आप अंदर क्या हो रहा है पर विस्तृत सकता है 'deployment.bat' कोशिश , विशेष रूप से तर्क कैसे संसाधित किया जाता है और उस वर्ग को पारित किया जाता है जिसका आप उल्लेख कर रहे हैं। साथ ही, मैंने आपकी पोस्ट को स्पष्ट करने और अपनी समस्या को स्पष्ट करने के लिए संपादित किया है, कृपया समीक्षा करें और आवश्यकतानुसार संपादित/रोल करने के लिए स्वतंत्र महसूस करें। –

उत्तर

2

आप किसी भी तरह से अपने पासवर्ड से बच नहीं सकते हैं।
रिक्त स्थान के साथ उद्धरण के साथ कुछ संयोजनों को एक पैरामीटर में नहीं रखा जा सकता है।

इस " (<space><quote><space>) की तरह यदि आप कुछ उद्धरण जोड़ते हैं, तो यह संभव नहीं है, भले ही आप रिक्त स्थान और उद्धरण उद्धरण दें।

myBat " 
myBat " " " 
myBat^" 
myBat ^"^ ^"^ ^" 

यहां अपने पासवर्ड के अंदर सभी उद्धरणों को दोगुना करने और उद्धरणों में अपना पासवर्ड संलग्न करने के लिए सबसे अच्छा है।
फिर आप अन्य सभी पात्रों का उपयोग किसी भी समस्या के बिना कर सकते हैं।

deployment.bat "foo \ $ सेवा \" "ver \ 1"

और में

deployment.bat

@echo off 
setlocal DisableDelayedExpansion 
set "pwd=%~1" 
setlocal EnableDelayedExpansion 
set "pwd=!pwd:""="!" 
echo pwd='!pwd!' 

आप विशेष characterts के साथ समस्याओं से बचने के लिए केवल देरी विस्तार के साथ अपना पासवर्ड का उपयोग करना चाहिए ।

कमांड लाइन तक पहुँचने के लिए मानकों आप भी
SO: How to receive even the strangest command line parameters?

2
" foo\$ser\"ver\ 1 " 

पूर्ण स्ट्रिंग को उद्धृत करने के लिए आपको उद्धरण से बचने की आवश्यकता है ताकि इसे अंतिम उद्धरण के रूप में नहीं देखा जा सके।

और ऐसे मामलों में जहां उद्धरण पहले से बैकस्लैश के साथ प्रीफ़िक्स किया गया है, तो आपको बैकस्लैश से बचना होगा। तो

this isa\"test 

के रूप में एक पासवर्ड के रूप में

"thisisa\\\"test" 

अधिक जानकारी के लिए लिखा जाना चाहिए, this खिड़कियों में पार्स तर्कों के "सामान्य" तरीका है।

संपादित - बस परीक्षण दस्तावेज करने के लिए। इस बैच फ़ाइल (test.cmd)

का उपयोग
@echo off 
    cls 
    echo(-------------------------------------------- 
    echo [%1][%2][%3][%4][%5][%6][%7][%8][%9] 
    echo(-------------------------------------------- 
    cmdline.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 
    echo(-------------------------------------------- 
    cmdline.exe %* 
    echo(-------------------------------------------- 
    java CmdLine %1 %2 %3 %4 %5 %6 %7 %8 %9 
    echo(-------------------------------------------- 
    java CmdLine %* 
    echo(-------------------------------------------- 

जहां cmdline.exe इस ग कोड

#include "windows.h" 
#include "stdio.h" 

void main(int argc, char **argv){ 
    int i; 
    printf("cmdline:[%s]\r\n\r\n",GetCommandLine()); 
    for(i = 0; i < argc ; i++) printf("arg_%03d:[%s]\r\n",i,argv[i]); 
}; 

से प्राप्त होता है और CmdLine.java

public class CmdLine { 
    public static void main (String[] args) { 
     int i = 0; 
     for (String s: args) { 
      System.out.println(String.format("arg_%03d:[%s]",++i,s)); 
     } 
    } 
} 

test.cmd " foo\$ser\"ver\ 1 " चल रहा है परिणाम

-------------------------------------------- 
[" foo\$ser\"ver\][1]["][][][][][][] 
-------------------------------------------- 
cmdline:[cmdline.exe " foo\$ser\"ver\ 1 "  ] 

arg_000:[cmdline.exe] 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
cmdline:[cmdline.exe " foo\$ser\"ver\ 1 "] 

arg_000:[cmdline.exe] 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
हैं
+0

'... यह विंडोज़ में तर्कों को पार्स करने का" सामान्य "तरीका है लेकिन बैच फ़ाइलों के लिए नहीं। बैकस्लैश को बैच में नहीं, – jeb

+1

@jeb से बचने की आवश्यकता नहीं है। लेकिन समस्या यह है कि अंतिम कार्यक्रम के अंदर संकेतित पासवर्ड प्राप्त करना है (कक्षा जिसे ओपी राज्य कहा जाता है) इसे बैच फ़ाइल के पैरामीटर के रूप में पास कर रहा है। इससे कोई फ़र्क नहीं पड़ता कि बैच फ़ाइल क्या देखती है, प्रश्न यह है कि इस वर्ग में कमांड लाइन मान को परिवहन करने के लिए क्या आवश्यक है और कक्षा सही मूल्य को देखती है। और यह कार्यक्रम का तर्क पार्सर है जिसके लिए पात्रों से अलग भागने की आवश्यकता होती है। –

+0

ठीक है, आप सही हैं, मैंने समस्या को कम करने के लिए केवल बैच फ़ाइल में पासवर्ड को अंतिम रूप देने के लिए अंतिम प्रोग्राम में नहीं किया – jeb

संबंधित मुद्दे