字符串中的延迟扩展和感叹号

时间:2017-03-10 08:27:27

标签: batch-file

好的,所以我对批处理脚本仍然很陌生,我的代码存在这个问题,我在代码中使用setlocal enabledelayedexpansion for for循环,For循环遍历文件夹名称一个特定的目录,但问题是某些名称可能包含"!"(感叹号),如果是这种情况,它们不计入"!文件名!&# 34;当代码创建一个新目录时,它不包含"!"。此外,当xcopy尝试从原始文件夹复制文件时,找不到该文件夹​​,因为变量"!filename!"与原始版本不同(没有感叹号)。

所以我发现为此我只需添加" setlocal启用延迟扩展"代码的某些部分并在其他部分关闭,但我似乎找不到合适的地方。

代码:

function btn_booking_hour()
    { 

    var date = $('#datehour').val();
    var renter_id = $("#ownerid").val();
    var guests_quantity = $('#no_of_guests').val();
    var property_id = $('#property_id').val(); 
    var selectedIds="";
    var selectedObject = document.getElementsByClassName('hour_slots_available slot_activated');
    for(var i=0;i<selectedObject.length;i++)
      selectedIds+=selectedObject[i].id+",";

    if(selectedIds == ""){

        alert("Please select Hour-Slot(s) before Booking");
    }
    else{

        $.ajax({

    type: 'POST',
    dataType:'json',
    url:baseURL+'site/rentals/ajaxhourshow',

    data:{'selectedHours':selectedIds,'property_id':property_id,'date':date,'guests_quantity':guests_quantity,'renter_id':renter_id},

    success: function(responce){

        var myJSON = JSON.stringify(responce);
        var packet = $.parseJSON(myJSON);

        var  prd_id=packet.property_id;
        var hour_slots=packet.hour_slots;
        window.location.href = baseURL+'booking/'+prd_id;
        }
    });
   }

}

Call部分调用另一个小的(~5行)批处理文件,该文件检查sqlplus服务器是否为&#34;!filename!&#34;是有效的

编辑:整个代码工作正常并做了应有的事情,除非有一个&#34;!&#34;在一些文件夹的名称。

2 个答案:

答案 0 :(得分:4)

问题是set filename=%%O中的参数扩展。 在%%O仍然是感叹号,但是当启用延迟扩展时,刘海就会被丢弃 结论很简单,扩展FOR参数时必须禁用延迟扩展。

但是当你还需要延迟扩张时? 您只需切换模式。

setlocal DisableDelayedExpansion
For /f "tokens=*" %%O in ('dir /b /a:d "%Location_Folder%"') do (
    set "filename=%%O" -- Here the DelayedExpansion have to be disabled
    setlocal EnableDelayedExpansion

    call D:\somefolder\otherfolder\batscriptname.bat filename
    set "Validation="
     ...
    endlocal
)

另请参阅我对CALL myBat.bat filename的修改,而不是CALL myBat.bat !filename! 您不应该在CALL中使用内容,最好通过引用使用变量,在函数中使用

的内容
set "_filename=!%1!"

这是因为CALL本身对空格,插入符号等有一些讨厌的行为

答案 1 :(得分:1)

如果在代码块中使用变量(带括号的系列命令),那么@using (Html.BeginForm("Update", "InvitationMails", FormMethod.Post)) //maby you need GET { @Html.EditorFor(model => model.First().Link, null, "start", //That will set id and name attributes to start new { @class = "form-control", placeholder = "Email" }) <ul class="btn btn-default" style="width: 150px; list-style-type: none; font-size: 16px; margin-left: 20px"> <li style="color: white"> <button type="submit" style="color:white">Добавить почту</button> </li> </ul> } 将在最初遇到块时产生变量的值(即分析时间值) )和%var%变量的值,因为它在块期间发生变化(即“运行时”值)。

如果!var!过程 - 内部或外部,则过程看到的变量值是来自父级的运行时值。如果在被调用过程中更改了这些值,则应用相同的规则,并将更改的值返回给父过程。

然而如果您调用call,那么如果您执行setlocal指令或到达文件末尾,则所做的任何值变化都会恢复为原始值endlocal的上下文。

好的 - 这就是delayedexpansion的工作方式。

在您的情况下,根本不需要delayedexpansion。在主线(setlocal)的循环中,您可以使用%%O代替%%O。在!filename!过程中,您可以将两个:valid命令移到代码块之外,然后根本不需要使用set,因为不需要访问其值在其中变化的变量块。

!vars!