2016-09-09 7 views
1

私の問題にタイトルを付ける方法がわかりません(できるだけ試してみました)が、問題があるのは試してみるときですファイル名を読み込み、私が書いたバックアップスクリプトでそれらを使うのです。私はもともとファイル名に&のファイルがないことをテストしていました。 )今までは問題があるだろうということを理解ファイル名に「&Batch」が含まれています

ここでは、以下の例では、コール件まで使用されているコードの一部です:。

:backup2 
if %DEBUG%=="t" echo Begin backup part 2 
for %%? in ("!FILEREADIN!") do (
SET "FILENAME=%%~n?%%~x?" 
SET "BACKUPFQP=%%~f?" 
SET "BACKUPLAST=%%~t?" 
call :getlength FILELENGTH "!FILENAME!" 

とにかく一部私はに実行しています私私がファイル名の長さ(スクリプトの別のセクションで使用される)を取得するためにコード内のファイル名で作業しているときにssueを使用します。私はそこに、通常はコマンドとして&のスタッフ権を使用しようとバッチスクリプトのエラーを持っていないために&年代をエスケープするが、1つ(または複数のファイルを読み込む際にされていることを知っている

:getlength 
SETLOCAL enabledelayedexpansion 
if %DEBUG%=="t" echo %2 parsed... %%2 delayed... !%2! 
SET "LENGTH=!%1!" 
SET "STRING=%2" 
REM need to correct the string for the "" that get added from passing in %2 
REM Issue arises with this part below when working on a file name with a & 
SET "STRING=!STRING:~1,-1!" 
:getlengthwhile 
if %DEBUG%=="t" echo Length !LENGTH! 
if %DEBUG%=="t" echo String left: !STRING! 
SET /a "LENGTH+=1" 
REM Issue here too when working with file names with &'s 
SET "STRING=%STRING:~1%" 
if %DEBUG%=="t" echo Length now !LENGTH! 
if %DEBUG%=="t" echo String now left: !STRING! 
if %DEBUG%=="t" pause 
if not ["%STRING%"]==[""] (
if %DEBUG%=="t" echo Continuing source length calculation 
Goto :getlengthwhile 
) else (
if %DEBUG%=="t" echo Length calculated) 
ENDLOCAL & SET TEMPNUM=%LENGTH% 
SET "%~1=%TEMPNUM%" 
if %DEBUG%=="t" echo !%1! 
if %DEBUG%=="t" pause 
goto :eof 

)その名の通りに私はそれを正しく働かせるには?

は、ここで私はとの問題を抱えているファイル名の例だと、私は私のスクリプト実行しているとき、何が起こる:言っ

File "E:\Projects\.\Abilities&Events.docx" 
Press any key to continue . . . 
Begin backup part 2 
"Abilities&Events.docx" parsed... %2 delayed... 
'Events.docx""' is not recognized as an internal or external command, operable program or batch file. 
+0

変数の周りにes。遅延拡張を使用してください – jeb

+0

それは動作しません。私はすでに遅延拡張をしており、適切な長さを得るために変数の周りに引用符を付けることはできません。また、私がこのファイルをコピーしようとするとエラーが出るので、内部または外部のコマンドとして認識されません。 実行可能なプログラムまたはバッチファイルです。" –

+0

トピックはありませんが、Powershellの使用については本当に考えなければなりません。 – Sean

答えて

1

として、あなたはより多くの引用符と多くの遅延拡張を使用する必要があります。
Btw。あなたのコードは、あなたがSET "LENGTH=!%1!"set LENGTH=0

:getlength 

SETLOCAL Enabledelayedexpansion 
SET "LENGTH=!%1!" 
SET "STRING=%~2" 

:getlengthwhile 
if defined STRING (
    set /a LENGTH+=1 
    set "string=!string:~0,-1!" 
    goto :getlengthwhile 
) 
echo !LENGTH! 
(
    ENDLOCAL 
    SET "%~1=%LENGTH%" 
) 
goto :eof 

あなたのコードのもう一つの問題を変更する必要があり、そうでないかもしれない、これは意図していた、%1で変数に長さを追加すると、それはファイル名で失敗し、このライン

call :getlength FILELENGTH "!FILENAME!" 

にありますこれらはCALLによって倍増されるので、^を含有する。
だから、私は私の問題への答えを見つけたあなたはSO: How do you get the string length in a batch file?

+0

ありがとうございました。私は実際には、バックアップスクリプトをファイル名の長さにして後で処理する代わりに、より良いバックアップスクリプトを実行する方法を見つけました。 hは、次のようなものを使ってそれらの部分を削除するためにも使用できます: 'SET FILETESTPART =!FILEREADIN! %DEBUG%== "t" echo!FILETESTPART! SET "FILETESTPART =!FILETESTPART:%SOURCE%=!" %DEBUG%== "t" echo "!FILETESTPART!"の後のファイル名 SET "FILETESTPART =!FILETESTPART:〜3!" %DEBUG%== "t" echo "!FILETESTPART!"の後のファイル名 –

+0

まだバッチプログラムを書く初心者ですが、どのようにうまくいくか分かります。 –

0

で見ることができるはるかに高速のstrlen関数について

call :getlength FILELENGTH FILENAME 

... 

:getlength  
SETLOCAL Enabledelayedexpansion 
SET "LENGTH=!%1!" 
SET "STRING=!%2!" 

を使用することをお勧めします。助けてくれてありがとう。 (http://ss64.com/nt/syntax-replace.html

は私が行うことができる置き換えることを知りませんでした:

私のソリューションは、私はこのサイトから(私もそれらの部分を削除するために使用することができます)変数の部品を交換できることを発見した後でした私はそれが必要なくなったので、私のGETLENGTH関数を()捨ててしまったし、このようなものになってしまった

)。:私は、変数の一部を取得する(http://ss64.com/nt/syntax-substring.html「参照のためのサイト):可能であったことを知っていた

:backup2 
if %DEBUG%=="t" echo Begin backup part 2 
for %%? in ("!FILEREADIN!") do (
SET "FILENAME=%%~n?%%~x?" 
SET "BACKUPFQP=%%~f?" 
SET "BACKUPLAST=%%~t?" 
if %DEBUG%=="t" echo Filename before "!FILENAME!" 
SET FILETESTPART=!FILEREADIN! 
if %DEBUG%=="t" echo !FILETESTPART! 
SET "FILETESTPART=!FILETESTPART:%SOURCE%=!" 
if %DEBUG%=="t" echo Filename after "!FILETESTPART!" 
SET "FILETESTPART=!FILETESTPART:~3!" 
if %DEBUG%=="t" echo Filename after "!FILETESTPART!" 
関連する問題