4

ループにforfilesを使用し、圧縮に7zaを使用して、古いファイルを圧縮するスクリプトを作成しています。私はファイル名のスペースを処理する方法に苦労していて、うまくいくように見える解決策を見つけましたが、なぜそれを本番環境に展開することに神経質になっているのか理解できません。

動作しているように見えるコマンドは次のとおりです。

forfiles -p%rootLogDir% -s -m*.log -d-14 -c"cmd /c 7za a -tzip """@PATH\@FILE-%date%.zip""" """@PATH\@FILE""""

7zaへのパスとファイル名の引数には、3つ(はい3つ)の引用符が含まれていることに注意してください。1セットの引用符は何もしません。2セットの引用符は、指定されたものではなく、ディレクトリ内のすべてのファイルをアーカイブに追加するスクリプトになり、3つは機能しているように見えます。

なぜそんなに多くが必要なのか誰かが説明できますか?1セットであとは余計だと思っていたのですが、どうやら間違っているようです。

4

3 に答える 3

2

forfilescmd.exeサブコマンドですか?その場合は、使用可能な多くの(MS)Windowsタグの1つを使用して質問にタグを付け直す必要があります。)

引用は、シェルスクリプトやバットスクリプトの経験が豊富な人にとっても、腹立たしい経験になる可能性があります。

@BugFinderのメッセージは適切であり、3つのdbl-quotesは、単一の二重引用符文字を「引用」する1つの方法であると付け加えます。

コマンドプロセッサ(cmd.exe?)を使用して作業しています。コマンド(1つ以上の単語または演算子を含む)を入力します。

myCommand /s /d %dir% file1 file2 > sumFile

次に、Enterキーを押します。コマンドプロセッサは、送信したコマンドの実行を開始するだけでなく、行をスキャンして、変数名などの特殊な大文字と小文字の単語や記号を探します。Unixシェルでは、環境変数はまたはのようになり$varNameます${varName}。.batファイル%var%または%%v%%。その変数は値に変換する必要があります。

これは、コマンドプロセッサが行う1つのパスであり、他にもあります。ただし、必要に応じて、cmd-processorは1つの単語と見なす必要のある単語セットをスキャンしています。を持っている場合var="one two"、値側を引用符で囲まないと、それを処理する必要のあるコマンドが混乱します。それは次のようになりますvar=one .... two(別の単語ですよね?)。

したがって、何らかの理由で二重引用符を介して処理の下位層に渡す必要がある場合は、コマンドプロセッサの規則に従い、必要に応じて引用符を付ける必要があります。そうすれば、すべてが正常に機能します。

「単語」が引用符で囲まれた単語であるのと同じように、"""引用符で囲まれた二重引用符です。コマンドプロセッサが通常の引用符の処理を行った後も、真ん中の二重引用符は、コマンドラインにあるもののコマンドプロセッサの「ビュー」に残ります(変数が展開され、他のすべての処理ルールの順序が変更された後)続いて。)

ふぅ!

それで、それをまとめるために、あなたはコメントで書きました

しかし、その後"""-> ""-> "

いいえ、"""=>"

では、なぜ1つの引用では不十分なのですか?

を使用"""することは、コマンドプロセッサにスタンドアロンの二重引用符文字をコマンドラインに残して爆発させないようにする1つの方法であるためです。

それとも、最初の要約された二重引用符は、ある種の魔法の力を獲得しますか?

"""魔法の力はありません。コマンドには後のsがあることに注意してください。各セットは"、後の処理のために1文字を残しています。

@BugFinderが指摘しているように、それで\"十分かもしれませんが、使用しているコマンドプロセッサまたはシェルがわからないため、テストを実行できません。

最後に、ベリサリウスによって書かれた優れたリマインダーごとに、

StackOverflowにあなたを歓迎し、私たちが通常ここで行う3つのことを思い出させてください:1)助けを受け取ったら、あなたの専門分野の質問に答えて、それも与えてみてください2)FAQを読んでくださいhttp://tinyurl.com/ 2vycnvr、3)良いQ&Aが表示されたら、灰色の三角形( http://i.stack.imgur.com/kygEP.png )を使用して投票します。システムの信頼性は、ユーザーが獲得する評判に基づいているためです。彼らの知識を共有する。また、チェックマーク記号( http://i.stack.imgur.com/uqJeW.png)を押して、問題をより適切に解決する答えを受け入れることを忘れないでください。

これがお役に立てば幸いです。

于 2011-05-27T03:38:09.113 に答える
1

簡単に推測すると、「 "" = "」のように、たとえば、引用符の周りに2つの引用符があります。「\」でも十分だった可能性があります。

于 2011-05-25T06:59:18.920 に答える
0

スペースを含むすべてのファイル名とパスは引用符で囲む必要があります。

次に、あなたの質問に関して、次のようなパスを述べてはどうでしょうか。

start /max /d"C:\Program files\foo\" ba.exe -somearguments
于 2019-04-26T02:43:33.443 に答える