好的,所以我对批处理脚本仍然很陌生,我的代码存在这个问题,我在代码中使用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;在一些文件夹的名称。
答案 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!